5排序-1插入排序

#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;
}//折半排序可参考二分查找

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值