排序算法的分析和应用
希尔排序
自己设计一个长度不小于10的乱序数组,用希尔排序,自己设定希尔排序参数
关键字序列{25,20,99,16,11,1,22,26,42,17}
n = 10;
d1 = n / 2 = 5;
d2 = ⌊d1 / 2⌋ = 2;
d3 = d2 / 2 =1;
代码:
//n为数组中元素的个数
void ShellSort(int a[],int n){
int d,i,j;
for(d=n/2;d>=i;d=d/2) //d为步长,每次缩小1/2,组内相邻元素下标相差d
for(i=d+1;i<=n;i++)
if(a[i]<a[i-d]){
//前后元素下标相差d
a[0]=a[i]; //a[0]处暂存当前要排序的元素
for(j=i-d;j>=0&&a[0]<a[j];j-=d)
a[j+d]=a[j]; //后移
a[j+d]=a[0]; //跳出循环将a[0]保存的数插入相应位置中
}
}
画出每一轮希尔排序的状态
堆排序
自己设计一个长度不小于10的乱序数组,用堆排序,最终要生成升序数组,画出建堆后的状态
关键字序列{25,20,99,16,11,1,22,26,42,17}
建立大根堆:
代码:
void HeapSort(int a[],int n)
{
for(int i = n / 2;i > 0;i--) //从n/2到1依次调整堆
HeadAdjust(a,i,n); //调整第i个关键字
for(int i = n;i > 1;i--)