希尔排序(shell sort)的基本理解是代码上更加复杂的插入排序(insertionSort),对于我们普通的插入排序来说,若是排序对象已有一定的顺序,那插入排序的效率非常高,但是对于顺序非常乱的话,那插入排序将会十分复杂。而希尔排序这是先对数组分组,先对每一小组进行插入排序,交换不相邻的元素,多次局部排序将会使大数组基本有序,最后再进行一次完整的插入排序。
实现希尔排序的第一步我们要进行分组,常见的分组手段有对分法,分组情况可如下:
c语言代码实现
#include<stdio.h>
#include<stdlib.h> //提供malloc函数
int main() {
int len ;
printf("请输入需要排序的数组的长度:");
scanf("%d", &len);
int* nums = (int*)malloc(sizeof(int) * len);
for (int i = 0; i < len; i++) {
scanf("%d", &nums[i]);
}
int gap = len / 2;
while (gap > 0) { //每完成一次while循环,代表完成了一次分组后的插入排序
for (int i = 0; i < gap; i++) {
for (int j = i+gap; j < len; j += gap) { //对间隔为gap的数组成员进行插入排序
for(int k=i;k<len;k+=gap){
if(nums[k]>=nums[j]){
int t=nums[j];
for(int m=j;m>k;m-=gap){
nums[m]=nums[m-gap];
}
nums[k]=t;
break;
}
}
}
}
gap /= 2;
}
for (int i = 0; i < len; i++) {
printf("%d\n", nums[i]);
}
return 0;
}
c++中间过程:
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int main() {
int len ;
cout<<"请输入需要排序的数组的长度:";
cin>>len;
int* nums = (int*)malloc(sizeof(int) * len);
for (int i = 0; i < len; i++) {
cin>>nums[i];
}
int gap = len / 2;
int count=1;
while (gap > 0) { //每完成一次while循环,代表完成了一次分组后的插入排序
cout<<"第"<<count<<"次分组:"<<endl;
for (int i = 0; i < gap; i++) {
cout<<"第"<<i<<"组:" ;
cout<<nums[i]<<" ";
for (int j = i+gap; j < len; j += gap) { //对间隔为gap的数组成员进行插入排序
cout<<nums[j]<<" ";
for(int k=i;k<len;k+=gap){
if(nums[k]>=nums[j]){
int t=nums[j];
for(int m=j;m>k;m-=gap){
nums[m]=nums[m-gap];
}
nums[k]=t;
break;
}
}
}
cout<<endl;
}
gap /= 2;
count++;
}
cout<<endl<<"结果:"<<endl;
for (int i = 0; i < len; i++) {
printf("%d\n", nums[i]);
}
return 0;
}