常用排序

代码中所有数组都是 1~n。
1、冒泡排序

void sort1( int a[],int n)
{
    for(int i=1; i<=n-1; i++)
        for(int j=1; j<=n-i; j++)
            if(a[j+1]<a[j])
                swap(a[j],a[j+1]);
}

2、选择排序

void sort2(int a[],int n)
{
    for(int i=1;i<=n;i++)
    {
         int k=i;
         for(int j=i;j<=n;j++)
         if(a[j]<a[i])
         k=j;
         swap(a[k],a[i]);
    }
}

3、归并排序

void Merge(int *a,int l,int m,int r)
{
    //将两个有序的子数组R[l,m)和R[m+1,r]归并成一个有序 R[l,r]
    int cnt1=l;
    int cnt2=m+1;
    int k=1;
    int s[r-l+5];//大小自定
    while(cnt1<=m&&cnt2<=r)
        s[k++]=a[cnt1]>a[cnt2]? a[cnt2++]:a[cnt1++];
    while(cnt1<=m)
        s[k++]=a[cnt1++];
    while(cnt2<=r)
        s[k++]=a[cnt2++];
    for(int i=l; i<=r; i++)
        a[i]=s[i-l+1];
}
void Merge_sort(int a[],int l,int r)
{
    if(l<r)
    {
        int m=(l+r)/2;
        Merge_sort(a,l,m);
        Merge_sort(a,m+1,r);
        Merge(a,l,m,r);
    }
}

4、插入排序
把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。

void insert_sort(int a[], int n)
{
    int i, j, k;
    for (i = 1; i < n; i++)
    {
        for (j = i - 1; j >= 0; j--)
            if (a[j] < a[i])
                break;
        if (j != i - 1)
        {
            int temp = a[i];
            for (k = i - 1; k > j; k--)
                a[k + 1] = a[k];
            a[k + 1] = temp;
        }
    }
}

5、快速排序
快速排序算法:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。

void quick_sort(int *a,int l,int r)
{
    if(l<r)
    {
        int i,j,tmp;
        i=l;
        j=r;
        tmp=a[i];
        while(i<j)
        {
            while(i<j&&a[j]>tmp)
                j--;// 从右向左找第一个小于x的数
            if(i<j)
                a[i++]=a[j];
            while(i<j&&a[i]<tmp)
                i++;// 从左向右找第一个大于x的数
            if(i<j)
                a[j--]=a[i];
        }
        a[i]=tmp;
        quick_sort(a,l,i-1);
        quick_sort(a,i+1,r);
    }
}
上一篇:【温故而知新-Javascript】使用地理定位


下一篇:Java常用三种算法排序比较