希尔排序
一、希尔排序的基本思想
希尔排序的基本思想就是把数进行分组,按照一定的规律分组,最先可以按照d1这个增量分组,d1=n/2(n为数组中数的长度)来分成d1个分组,然后对分组内部的数进行直接插入排序再设置第二个增量d2来分组,如d2 = d1/2这样来分组直到增量为1停止。
二、对于这样的一个数组:
a[10] ={2,1,4,3,5,7,6,8,0,9}
d1增量为10/2= 5
2 1 4 3 5 7 6 8 0 9
这样分组得到(2,7),(1,6),(4,8),(3,0),(5,9)
执行后为:
2 1 4 0 5 7 6 8 3 9
d2增量为5/2=2
分组得到:(1,0,7,8,9),(2,4,5,6,3)
执行后:
2 0 3 1 4 7 5 8 6 9
d2增量为2/2=1
执行后:
0 1 2 3 4 5 6 7 8 9
核心代码:
for(d = length/2;d >0;d=d/2){//设置增量第一次增量为5,第二次为2第三次为1
for(int i = d;i<length ;i++){//对应的比较的次数分别是5,8,11次
//接下来做交换
for(int j = i-d;j>=0 ;j=j-d){
if(a[j]>a[j+d]){
temp = a[j];
a[j] =a[j+d];
a[j+d] = temp;
}
}
}
}
全部代码:
/**
*希尔排序
*@author 菜鸟
*@version 2014.6.13
*/
/**
*希尔排序原理
*希尔排序先是随便选一个小于数组长度n的d1作为第一个增量,
*下一步将其分为d1个分组,让是d1的倍数在同一个分组中,每
*次增量值只能减小按此分组直到d1为1时为止。
*对每一个分组进行直接插入排序。
*/
//此列以length为10 的数组为例
#include <iostream>
#include <windows.h>
using namespace std;
void shell_sort(int a[],int length){
int d;//表示增量
int temp=0;
int j;
for(d = length/2;d >0;d=d/2){//设置增量第一次增量为5,第二次为2第三次为1
for(int i = d;i<length ;i++){//对应的比较的次数分别是5,8,11次
//接下来做交换
for(int j = i-d;j>=0 ;j=j-d){
if(a[j]>a[j+d]){
temp = a[j];
a[j] =a[j+d];
a[j+d] = temp;
}
}
}
}
}
int main(){
int a[10] = {2,1,4,3,5,7,6,8,0,9};
shell_sort(a,10);
for(int i = 0;i <10;i++){
cout<<"第"<<(i+1)<<"个元素:"<<a[i]<<endl;
}
getchar();
system("PAUSE");
return 0;
}