shell排序是插入排序的一种所以内部有插入排序的代码
大概就是将数组更具增量划分成n个小数组,在小数组里面实现插入排序,在增量不断变小的过程中数列会变得有序,最后一次增量等于1会使得完全有序,
希尔排序的增量使用len/2
具体看源代码注视
#include <iostream>
using namespace std;
int* ShellSort(int *arr,int len)
{
for(int gap = len/2;gap>0;gap/=2)
//第一层循环是遍历增量每次都是除以二
{
for(int i=gap;i<len;i++)
//这一层表示遍历每一个组的成员这里不是以组遍历的,
//而是从每组的第一个成员遍历完成之后在开始遍历每组的第二个成员
//这样简化了代码,看起来变难了而已
{
for(int j=i-gap;j>=0;j-=gap)
//这里是将j组的当前成员和上一个成员比较
//这里实现实际上就是插入排序
{
if(arr[j]>arr[j+gap])
//判断完成就进行交换
{
int temp = arr[j];
arr[j] = arr[j+gap];
arr[j+gap] = temp;
}
}
}
}
return arr;
}
int main()
{
//具体的排序数组可以自行定义,或者键入
//把输入方式改了就变成c代码了,这里实际上就是c
int sz[10]={4523,54,546,7,46,54,879,546,55458,23156};
int* arr;
arr=ShellSort(sz,10);
for(int i=0;i<10;i++)
{
cout<<sz[i]<<" ";
}
cout<<endl;
return 0;
}