shell sort,一种基于插入排序的排序方法,总体而言还是一种较为好懂的排序方法。
要想弄懂希尔排序就先得学会插入排序,那我先大致讲一下插入排序的算法。
插入排序:
1.存储数组第二个元素,然后向前遍历。
2.如果前方元素大于之前储存的元素,则将整个数组往后移动一格。
3.如果找到一个比储存元素小的元素,则将储存的元素赋予它之后的一格。
4,存储数组第三个数然后循环前三步...
代码:
void insert_sort(int array[],int size)
{
for(int i = 1 ; i < size ; i++)
{
int temp = array[i]; //储存当前元素
int j = i-1; //从前一个向前遍历
while(j>=0 && array[j]>temp) //如果大于之前储存的元素,就整体后移数组
{
array[j+1]=array[j];
j -= 1;
}
array[j+1]=temp; //找到后赋值
}
}
希尔排序:
1.将数组分为长度为d组,每组进行插入排序。 d = (数组长度)/2
2.将d/2,继续插入排序,直到d=1再进行最后一次即结束。
代码:
#include <iostream>
#include <cmath>
using namespace std;
void insert_sort_gap(int array[],int size,int gap) //插入排序改版,多了参数步数
{
for(int i = gap ; i < size ; i+=gap) //gap即为之前说的d,每隔d个元素为同组元素
{
int temp = array[i]; //每组进行插入排序
int j = i-gap;
while(j>=0 && array[j]>temp)
{
array[j+gap]=array[j];
j -= gap;
}
array[j+gap]=temp;
}
}
void shell_sort(int array[],int size) //希尔排序本体
{
int d =size/2; //d不断除以2
while(d>=1) //只要d>=1就继续插入
{
insert_sort_gap(array,size,d);
d = d/2;
}
}
int main()
{
int a[] = {1,4,5,6,7,3,2,8,9};
shell_sort(a,sizeof(a)/sizeof(int));
for(int i = 0;i<sizeof(a)/sizeof(int);i++)
{
cout<<a[i];
}
}