希尔排序实际的C代码讲解
1.希尔排序原理
希尔排序用于将数组内元素进行排序,方法是设置“跨度”将数组进行分组
假设上面是待排数组,那么怎么进行排序呢?首先确定“跨度”gap,初始的gap等于数组长度的一半,之后gap等于源gap的一半,它代表的是将待排数组分割为多少组。比如图里待排元素有12个,那么初始gap就为6,就是说将12个元素分为6组。那么希尔排序的思想就是每次将一个元素以及每个相隔gap的元素作为一组,对每组的元素先进行排序,每次排序后将gap减小,知道将数组化为有序。
2.代码讲解
希尔排序实际代码的关键是写好三个循环。
第一层循环是将待排数组的元素进行分组。
for (gap = length / 2; gap >= 1;gap = gap/2) { // 分组的次数
}
第二层循环是对应gap所分组的组数。
for(i = gap; i < length; i ++) { // 每组遍历
}
第三层循环是为了对每组元素进行排序。
for (j = i - gap; j >= 0 && temp < data[j];j = j - gap) { //组内排序
}
实际的工作流程就是:假入是将待排数组用希尔排序排列为升序序列,每次将待排数组分好组后,第三层循环从后向前判断此元素和组内前一个元素(即前面相隔gap个元素的元素),如果前面大后面小,则交换位置。完成这一组的排序后,第二层元素负责换组,对应指针指向的元素向后移动到后一个元素(这里就是另一组元素的比较了)。
整体的一个代码如下:
int shell_sort(int *data, int length) {
int gap = 0; //分组的跨度
int i = 0, j = 0;
for (gap = length / 2; gap >= 1;gap = gap/2) { // 分组的次数
for(i = gap; i < length; i ++) { // 每组遍历
int temp = data[i];
for (j = i - gap; j >= 0 && temp < data[j];j = j - gap) { //组内排序
data[j+gap] = data[j];
}
data[j+gap] = temp;
}
}
return 0;
}
主函数:
int main(){
int i=0;
int data[DATA_ARRAY_LENGTH] = {23, 64, 24, 12, 9, 16, 53, 57, 71, 79, 87, 97};
shell_sort(data,DATA_ARRAY_LENGTH);
for(i = 0;i<DATA_ARRAY_LENGTH;i++){
printf("%4d",data[i]);
}
printf("\n");
}
希望对读者有帮助哈哈