从插入排序到希尔排序
本博文主要是我以前写过的一些算法程序,里面主要从简单的插入排序到希尔排序说明。
#include
#include
void shellSort(int *arr,int len); //在插入排序基础上进行修达到希尔排序
void
shellSortReal(int *arr,int len); //简化的希尔排序
void insertSort(int *arr,int len);
//原生态插入排序
int main(){
int
arr[5]={36,13,37,12,78};
//shellSort(arr,5);
shellSortReal(arr,5);
for(int
i=0;i<5;
i++)
std::cout<<arr[i]<<std::endl;
}
函数功能:
希尔排序的原理:希尔排序的原理是在插入排序原理上进行改进,以前插入排序是步长为1,依次当
前的元素插入到前面己经排好序的数组中,相当于是有一个己经排好序的数组,数组长度比实际的元
素数目大1,有一个新的元素要插入到数组中,因此我们只有从后往前插,假如是按从小到大排序,则
将当前元素与最后的元素比较,如果当前元素比最后面的元素小,则将最后的元素往后移一下,然后
再用当前元素与倒数第二个元素比较,如果还是比当前元素大,则将当前元素后移,实际上是正好移
到原理最后那个元素上了,注意:我说的当前元素是待插入元素。
那么希尔排序是分多次的不同步长的排序,相当于是将原来的数组斥分成许多子数组,这些子数组进
行插入排序再合并,并不断减少步长。至到步长为1.
入口参数:
arr,数组
len,数组大小
void shellSort(int *arr,int len){
for(int
gap=len/2; gap>0;gap=gap/2){//步长循环,不断缩小步长
for(int i=0;i
for(int
j=gap; j
int temp=arr[j];
int k=j-gap;
while(k>=0&&arr[k]>temp){
arr[k+gap]=arr[k];
k-=gap;
}
if(k!=j-gap){
arr[k+gap]=temp;
}
}
}
}
}
函数功能与原理:
这个函数的作用是相对于上面那个函数的简单,上面那个函数写法是正确的,但是代码量太大,不方
便理解。因此我们应该简化这些代码
希尔排序的原理:希尔排序的原理是在插入排序原理上进行改进,以前插入排序是步长为1,依次当
前的元素插入到前面己经排好序的数组中,相当于是有一个己经排好序的数组,数组长度比实际的元
素数目大1,有一个新的元素要插入到数组中,因此我们只有从后往前插,假如是按从小到大排序,则
将当前元素与最后的元素比较,如果当前元素比最后面的元素小,则将最后的元素往后移一下,然后
再用当前元素与倒数第二个元素比较,如果还是比当前元素大,则将当前元素后移,实际上是正好移
到原理最后那个元素上了,注意:我说的当前元素是待插入元素。
那么希尔排序是分多次的不同步长的排序,相当于是将原来的数组斥分成许多子数组,这些子数组进
行插入排序再合并,并不断减少步长。至到步长为1.
入口参数:
arr,数组
len,数组大小
void shellSortReal(int *arr,int len){
for(int
gap=len/2; gap>0;gap=gap/2){
for(int i=gap; i
int
temp=arr[i];
int
j=i-gap;
while(j>=0&&arr[j]>temp){
arr[j+gap]=arr[j];
j=j-gap;
}
if(j!=i-gap){
arr[j+gap]=temp;
}
}
}
}
函数功能:插入排序作用,原理是不停地从后面的数据中选择数据插入到前面己排好的数据列中,
因为前面的己经是排好的,因此只要在将后面选择的选据在前面的序列中找到自己的位置就可以了
将手上的数据从己排好序的数据后面开始,将这些数据往后挪,一直找到合适自己的位置就搞定了。
入口参数:arr,数组
len,数组大小
void insertSort(int *arr,int len){
for(int i=1; i
int temp=arr[i];
int j=i-1;
//从这个位置开始向前找合适的位置
while((j>=0)&&(arr[j]>temp)){//当前面的元素比temp要大时,则arr[J]要往后挪动。
arr[j+1]=arr[j];
//向后挪嘛,前面的元素覆盖后面的。
j--; //继续
}
if(j!=i-1){
//只有在需要插入的时候才插入,只有挪动过位置才需要处理
arr[j+1]=temp;
}
}
}