几种重要排序总结

一、冒泡排序

其原理为从a[0]开始,依次将其和后面的元素比较,若a[0]>a[i],则交换它们,一直比较到a[n]。
同理对a[1],a[2],...a[n-1]处理,即完成排序。

void bubble(int a[],int n){
        int t;
        for(int i=0;i<n;i++)
                for(int j=i+1;j<n;j++)
                        if(a[i]>a[j])
                                t=a[i],a[i]=a[j],a[j]=t;
}

二、二分排序 

原理:依次枚举每一个元素,采用二分搜索的方法在前i个数据中找到合适的位置插入(前i个数据已经排列好)。

例:给6 1 2 7 9 3 4 5 10 8排序

6 1 2 7 9 3 4 5 10 8

1插到6前面
1 6 2 7 9 3 4 5 10 8
1 2 6 7 9 3 4 5 10 8
1 2 6 7 9 3 4 5 10 8
1 2 6 7 9 3 4 5 10 8

3插到6前面
1 2 3 6 7 9 4 5 10 8

4插到6前面
1 2 3 4 6 7 9 5 10 8

5插到6前面
1 2 3 4 5 6 7 9 10 8
1 2 3 4 5 6 7 9 10 8

8插到9前面
1 2 3 4 5 6 7 8 9 10

#include<iostream>
using namespace std;
void sort2(int *a,int n){
        for(int i=0;i<n;i++){//对前i个进行排序
                int k=a[i];
                int x=0,y=i-1;
                while(x<=y){
                        int m=x+(y-x>>1);
                        if(a[m]>a[i])
                                y=m-1;
                        else
                                x=m+1;
                }//a[x]为第一个大于a[i]的数
                for(int j=i;j>x;j--)
                        a[j]=a[j-1];//插入点后面的数全部后移一位
                a[x]=k;//把a[i]赋值到对应位置
        }
}

三、快速排序

设置两点i,j代表向左和向右遍历到的点;

j遇到小于6的5停止向前,i遇到大于6的7,停止;

交换a[i]与a[j];

i,j未再遇到符合停止条件的值,继续向前直到相遇时停止;

将6与相遇点交换;

此时6左边的值均小于6,右边的值均大于6,6最终的位置定下来;

分别对6左边的片段和右边的片段重复该过程,直到片段被切成长度为1,最终所有值都找到了排序的位置。

void quick(int a[],int x,int y){
        if(x>=y)
                return;
        int p=a[x];
        int i=x,j=y;
        while(i<j){
        //交换右边小于p左边大于p的数字并找出p的位置
                while(i<j&&a[j]>=p)
                        j--;
                while(i<j&&a[i]<=p)
                        i++;
                int t=a[i];
                a[i]=a[j];
                a[j]=t;
        }
        a[x]=a[i];
        a[i]=p;
        quick(a,x,i-1);//快速排序左边一段
        quick(a,i+1,y);//快速排序右边一段
}
原文地址:https://www.cnblogs.com/aeipyuan/p/10704489.html