码迷,mamicode.com
首页 > 编程语言 > 详细

几种排序算法

时间:2020-05-06 18:09:33      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:简单选择排序   序列   else   升级   直接插入   冒泡排序   排列   基础上   个数   

所有排序都是从小到大进行排序

1插入排序

  插入排序的思想主要是,将[a1,a2,a3,a4....ai.......an]前ai-1个序列看成有序的,然后用第ai个数与前面的数进行比较,找到位置进行插入

    int i,j,temp;//a[len]
    for(i=1;i<len;i++){//假设a[0]一个数为有序数列,从a[1]开始,依次进行比较
        if(a[i]<a[i-1]){//满足条件
            temp = a[i];//暂时存放a[i]
            a[i] = a[i-1];
        for(j=i-2;temp<a[j];j--)//继续与前面的数进行比较
            a[j+1] = a[j];
        a[j+1] = temp; //将a[i]这个数放到对应的位置上
         }
    }    

2.折半插入排序

  在插入排序的基础上,将序列分为两部分(低半区,高半区)

    int i,j,temp;
    for(i=1;i<len;i++){
        temp = a[i];
        int low=0,high=i-1;
        while(low<=high){
            int m = (low+high)/2;
            if(temp<a[m])
                high = m - 1;//插入点在低半区
            else
                low = m + 1;//插入点在高半区 
        }
        for(j=i-1;j>=high+1;j--)//从插入点到i这个位置,进行位置交换
        //1 2 4 5 i=3排列后high=2;4 5要一次后移为3腾出位置 
            a[j+1] = a[j];
        a[high+1] = temp; //当low>high是,插入点就在high+1位置 
    }

3.希尔排序

  希尔排序又称缩小增量排序,它也属于插入排序

  基本思想是:将整个代排记录分割成若干个子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行一次直接插入排序

  最后一个增量一定是1

//希尔排序 
void shellInsert(int dk){
    int i,j;
    for(i=dk;i<len;i++){
        if(a[i]<a[i-dk]){
            int temp = a[i];
            for(j=i-dk;j>=0&&temp<a[j];j-=dk){//当前小组内进行移动 
                a[j+dk] = a[j];
            }
            a[j+dk] = temp;
        }
    }
} 
void sort3(){
    int dlta[] = {5,3,1};//增量序列 
    for(int k=0;k<3;k++)
        shellInsert(dlta[k]);
} 

4.快速排序

  快速排序是冒泡排序的升级,将任务一分为二,

  基本思想是:通过一趟排序,将待排记录分割成独立的两部分,(低半区,高半区),然后再分别对分隔出的两部分进行排序

  通过基本思想,我们可以用递归来写

//快速排序 
int Partition(int a[],int low,int high){
    int pivokey;
    //a[n] = a[low];//用a[n+1]存放枢轴 
    pivokey = a[low];
    while(low<high){
        while(low<high&&pivokey<=a[high])
            high--;
        a[low] = a[high];//将比中间值小的数移到低端 
        
        while(low<high&&pivokey>=a[low])
             low++;
        a[high] = a[low];//将比中间值大的数移到高端 
    }
    a[low] = pivokey;
    return low;//返回枢纽位置 
}
void sort4(int low,int high){
    //int low=0,high=len-1;
    if(low<high){
        int pivotloc = Partition(a,low,high);
        sort4(low,pivotloc-1);
        sort4(pivotloc+1,high);
    }
     
} 

5.简单选择排序

//选择排序
void sort5(){
    int i,j;
    for(i=0;i<len;i++){
        int min = i;
        for(j=i+1;j<len;j++){
            if(a[min]>a[j])
                min=j;
        }
        if(min!=i){
            int temp = a[min];
            a[min] = a[i];
            a[i] = temp;
        }
    }
} 

......

几种排序算法

标签:简单选择排序   序列   else   升级   直接插入   冒泡排序   排列   基础上   个数   

原文地址:https://www.cnblogs.com/Tisou1/p/12837733.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!