0.结构体

#define MAXSIZE 100
typedef struct{
	int key;
	int other;
}recordtype;
typedef struct{
	recordtype r[MAXSIZE+1];
	int length;
}table;

1.直接插入排序

//无哨兵插入排序
void insertsort(int a[], int n) {
	int i, j, x;
	for (i = 1; i < n; i++) 
	{
		x = a[i];
		j = i - 1;
		while (j >= 0 && a[j] > x) 
		{
			a[j + 1] = a[j];
			j--;
		}
		a[j + 1] = x;
	}
}

 //有哨兵
void insertsprt2(table* tab)
{
	int i,j;
	for (i = 2; i <= tab->length; i++)
	{
		j = i - 1;
		tab->r[0] = tab->r[i];
		while (tab->r[0].key < tab->r[j].key) 
		{
			tab->r[j + 1] = tab->r[j];
			j = j - 1;
		}
		tab->r[j + 1] = tab->r[0];
	}
}

2.二分插入排序

void binarysort(table* tab)
{
	int i, j, left, right, mid;
	for (i = 2; i <= tab->length; i++)
	{
		tab->r[0] = tab->r[i];  //保存待插入元素
		left = 1; right = i - 1;
		while (left <= right) 
		{
			mid = (left + right) / 2;
			if (tab->r[i].key < tab->r[mid].key)
				right = mid - 1;
			else
				left = mid + 1;		//插入位置是left
		}
		for (j = i - 1; j >= left; j--)
			tab->r[j + 1] = tab->r[j];
		tab->r[left] = tab->r[0];
	}
}

3.shell排序

//Shell排序
void shellinsertsort(table* tab)
{
	int i, j, d;
	d = tab->length / 2;
	while (d >= 1) {
		for (i = d + 1; i <= tab->length; i++);
		{
			tab->r[0] = tab->r[i];	//保存第i个元素
			j = i - d;	//向前找插入位置
			while (j > 0 && tab->r[0].key < tab->r[j].key)
			{
				tab->r[j + d] = tab->[j];
				j = j - d;
			}
			tab->r[j+d] = tab->r[0];
		}
		d / 2;
	}
}

void shellinsertsort(int a[], int length)
{
	int i, j, x, d;
	d = length / 2;
	while (d >= 1) 
	{
		for (i = i + d; i < length; i++)
		{
			x = a[i];
			j = i - d;
			while (x < a[j] && j>=0)
			{
				a[j + d] = a[j];
				j = j - d;
			}
			a[j + d] = x;
		}
		d / 2;
	}
}

4.直接选择排序

void simpleselectsort(table* tab)
{
	int i, j, k;
	for (j = i + 1; j <= tab->length; j++)
	{
		if (tab->r[j].key < tab->r[k].key) k = j;
		if (k != i)
		{
			tab->r[0] = tab->r[k];
			tab->r[k] = tab->r[i];
			tab->r[i] = tab->r[0];
		}
	}
}

5.堆排序(选择排序)

void heapsort(table* tab)
{
	int i;
	for(i=tab->length/2;i>=1;i++)
		shft(tab,i,tab->length);//堆所有元素建堆
	for(i=tab->length/2;i>=2;i--)//i表示当前堆的大小,即等待排序的元素个数
	{
		tab->r[0]=tab->r[i];
		tab->r[i]=tab->r[1];
		tab->r[1]=tab->r[0];
		shft(tab,i,i-1);
	}
}

6.冒泡排序(交换排序)

void bubblesort(table* tab)
{
	int i, j, done;
	i = 1;
	done = 1;
	while (i <= tab->length && done)	//最多进行tab->length次排序
	{
		done = 0;
		for(j=1;j<=tab->length;j++)
			if (tab->r[j + 1].key < tab->r[j].key)
			{
				tab->r[0] = tab->r[j];
				tab->r[j] = tab->r[j + 1];
				tab->r[j + 1] = tab->r[0];
				done = 1;
			}
		i++;
	}
}

7.快速排序(交换排序)

void quicksort(table* tab, int left, int right)
{
	int i, j;
	if (left < right)
	{
		i = left; j = right;
		tab->r[0] = tab->r[i];
		
		do {
			while (tab->r[j].key > tab->r[0].key && i < j) 
				j--;
			if (i < j)
			{
				tab->r[i].key = tab->r[j].key;
				i++;
			}
			while (tab->r[i].key < tab->r[0].key && i < j)
				i++;
			if (i < j)
			{
				tab->r[j].key = tab->r[i].key;
				j--;
			}
		} while (i != j);
		tab->r[i]=tab->r[0];
		quicksort(tab, left, i - 1);
		quicksort(tab, i + 1, right);
	}
}

8.二路归并排序
9.基数排序

Q.E.D.


窝似嫩叠