问题如下:
输入:n个数<a[1], a[2], ... , a[n]>
输出:输入序列的一个排列(即重新排序)<a[1], a[2], ... , a[n]>,使得a[1] <= a[2] <= ... <= a[n]
1.插入排序
#include <stdio.h>

/**//*
*插入排序
*输入: a:待排序数组
* n:n个数<a[0], a[1], ... , a[n-1]>
*输出: 输入序列的一个排列(即重新排序)<a[0], a[1], ... , a[n-1]>,使得a[0]<=a[1]<=...<=a[n-1]
*/
void InsertSort(int *a, int n)

...{
int i, j;
int x;
for(j=1; j<n; j++)

...{
x = a[j];
i = j - 1;
while((i >= 0) && (a[i] > x))

...{
a[i+1] = a[i];
i--;
}
a[i+1] = x;
}
}

int main()

...{
int i, n;
int A[10];
n = 10;
for(i=0; i<n; i++)

...{
scanf("%d", &A[i]);
}
InsertSort(A, n);
for(i=0; i<n; i++)
printf("%3d", A[i]);
printf(" ");

return 0;
}
循环不变式主要用来理解算法的正确性。对于循环不变式,必须证明它的三个性质:
初始化:它在循环的第一轮迭代开始之前,应该是正确的。
保持:如果在循环的某一次迭代开始之前它是正确的,那么,在下一次迭代开始之前,它也应该保持正确。
终止:当循环结束时,不变式给了我们一个有用的性质,它有助于表明算法是正确的。
执行算法InsertSort的元素比较次数在n - 1到n(n - 1) / 2之间。元素赋值次数等于元素比较次数加上n - 1。
2.合并排序
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>

void PrintResult(int *a, int length)

...{
int i;
for(i = 0; i < length; i++)
printf("%d ",a[i]);
printf(" ");
}

void Merge(int *a, int p, int q, int r)

...{
int i, j, k;
int n1, n2;
int *L;
int *R;

n1 = q - p + 1;
n2 = r - q;
L = (int *)malloc((n1 + 1) * sizeof(int));
R = (int *)malloc((n2 + 1) * sizeof(int));

for(i = 0; i < n1; i++)
L[i] = a[p+i];
for(j = 0; j < n2; j++)
R[j] = a[q+1+j];
L[n1] = INT_MAX;
R[n2] = INT_MAX;
i = 0;
j = 0;
for(k = p; k <= r; k++)

...{
if(L[i] <= R[j])

...{
a[k] = L[i];
i++;
}
else

...{
a[k] = R[j];
j++;
}
}

free(L);
free(R);
}

void MergeSort(int *a, int p, int r)

...{
int q;
if(p < r)

...{
q = (p + r) / 2;
MergeSort(a, p, q);
MergeSort(a, q+1, r);
Merge(a, p, q, r);
}
}

int main(int argc, char **argv)

...{
int i;

int a[9]=...{5,8,6,7,9,3,4,2,1};
MergeSort(a,0,8);
PrintResult(a,9);
return 0;
}