#include <bits/stdc++.h>
using namespace std;
int a[10]; //定义全局数组
void dir_insert_sort(int qa[],int number){ //直接插入排序
int i=0,j=0,min_set=0,temp=0;//下标,每轮插入位置与交换值
for(i=0;i<number;i++){ //一共扫number轮
min_set = i; //每一轮初始化值最小的位置(要交换的位置)是第i位
for(j=0;j<i;j++){ //从头开始扫描到第i-1位每次比较相邻两位
if(qa[i]<=qa[j]){ //qa[i]就是在本轮要插入的数,而0~i-1是升序排好的,所以插在第一个比他大的qa[j]前
min_set=j; //定好下标
temp=qa[i]; //本轮要插入的值
break;
}
}
for(j=i;j>min_set;j--)qa[j] = qa[j-1]; //从i-1位起至min_set位全部往后移一位
if(min_set!=i)qa[min_set] = temp; //min_set等于i表示本次插入的数就排在最后,则temp没有被更新仍然为0
}
}
void shell_sort(int a[],int n){ //希尔排序
int add=5; //设置步长
int number=n/add; //每次能够进行排序的组数
while(add){ //当前步长为正数就继续排
number=n/add; //本轮能进行排序的数目
for(int j=0;j<add;j++){ //扫一次每组
int *p=new int[number]; //申请临时空间指针
for(int i=0;i<number;i++)p[i]=a[i*add+j]; //原数组内每个数都赋给临时数组
dir_insert_sort(p,number); //组内用直接插入排序
for(int i=0;i<number;i++)a[i*add+j]=p[i]; //临时数组的数赋回给原数组
delete[]p; //释放空间
}
if(add==1)break;//步长剩下1就跳出
add=add-2; //否则步长减2
if(add<1)add=1; //步长小于1(只能是由2为0)则下一轮步长1
}
}
int main(){//插入排序第三种是折半排序,与直接插入区别在找的时候用折半查找而非顺序查找
for(int i=0;i<10;++i)a[i]=i; //0~9依次赋值
cout << "dir_insert_sort:" << endl; //提示语
random_shuffle(a, a + 9); //将序列的所有元素随机排序
for(int i=0; i<10;++i)cout<<a[i]<<" ";cout << endl; //输出数组
dir_insert_sort(a,10); //直接插入排序
for(int i=0; i<10;++i)cout<<a[i]<<" ";cout << endl; //输出数组
cout << "shell_sort:" << endl; //提示语
random_shuffle(a, a + 9); //将序列的所有元素随机排序
for(int i=0; i<10;++i)cout<<a[i]<<" ";cout << endl; //输出数组
shell_sort(a,10); //希尔排序
for(int i=0; i<10;++i)cout<<a[i]<<" ";cout << endl; //输出数组
return 0;
}//折半排序可参考二分查找
5排序-1插入排序
最新推荐文章于 2021-04-14 21:30:16 发布