几种排序算法

Posted tisou1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了几种排序算法相关的知识,希望对你有一定的参考价值。

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

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;
        }
    }
} 

......

以上是关于几种排序算法的主要内容,如果未能解决你的问题,请参考以下文章

几种排序算法分析

几种排序算法分析

几种排序算法分析

关于选择排序并去重的几种算法分析

几种常见的排序算法分析学习

java开发过程中几种常用算法