常见的排序算法:
1.算法思想
希尔排序类似于直接插入排序,不同之处在于其排序使用到了增量。使用增量能够以增量为步长的数据进行排序。最后在进行一次增量为1的排序,即为直接插入排序,该趟排序时数据已经基本有序。
希尔排序的关键是选取每趟排序的增量大小。
2.测试结果
//测试数据
int a[]= {49,38,65,97,76,13,27,49};
//增量
int delta[] = {5,3,1};
结果如下:
3.完整代码
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 20
void shellInsert(int a[], int len, int d) {
int temp,i,j;//临时变量
//增量为d
for(int i=d; i<len; i+=1) {
//如果未排序记录的第一个元素小于排序记录的最后一个元素,需要调整
if(a[i]<a[i-d]) {
//开始调整
temp = a[i];
for(j=i-d; j>=0 && a[j]>temp; j-=d) {
a[j+d] = a[j];
}
a[j+d] = temp;
}
}
}
void shellSort(int a[],int len, int delta[], int t) {
//进行希尔排序
for(int i=0; i<t; i++) {
shellInsert(a, len, delta[i]);
}
}
int main() {
int a[]= {49,38,65,97,76,13,27,49};
int delta[] = {5,3,1};
int len = sizeof(a) / sizeof(a[0]);
int t = sizeof(delta) / sizeof(delta[0]);
int i;
printf("排序前为:\n");
for(i=0; i<len; i++) {
printf("%d\t",a[i]);
}
shellSort(a, len, delta, t);
printf("\n排序后为:\n");
for(i=0; i<len; i++) {
printf("%d\t",a[i]);
}
return 0;
}