[其它]几种常见的排序

冒泡排序

冒泡排序的原理总的来说就是小的浮上来,大的沉底。

思路:如果\(a_i < a_{i+1}\),则交换。

原理示意图:

1396752-20180712152723291-445667032.gif

冒泡排序的平均情况时间复杂度为\(O(n^2)\)

代码如下:

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

快速排序

快排的思路是:先选取一个基准,然后将比基准小的放在左边,将比基准大的放在右边,然后再分小区间,重复以上操作。

原理示意图:

1396752-20180712153636947-477837001.gif

快速排序的平均情况时间复杂度为\(O(n\log_2 n)\)

代码:

void Quick_Sort(int s[], int l, int r) {
    if(l<r) {
        int low=l;
        int high=r;
        int pivot = s[l];
        while(low<high) {
            while(low<high&&s[high]>= pivot)
                high--;
            if(low<high)
                s[low++] = s[high];
            while(low<high&&s[low]<pivot)
                low++;
            if(low<high)
                s[high--] = s[low];
        }
        s[low]=pivot;
        QuickSort(s, l, low - 1);
        QuickSort(s, low + 1, r);
    }
}

插入排序

首先回忆一下你是怎么玩牌的,每次摸到一张牌,都要把它插入到正确位置。

插入排序的原理一样,首先查找一下它的正确位置\(a_i\),然后将\(a_i\)后数向后移动一位,将这个数插入进去。

原理示意图:

1396752-20180712155101590-1804739333.gif

插入排序的平均情况时间复杂度是\(O(n^2)\)

代码:

void Insertion_Sort(int arr[],int length) {
    int i,j,key;
    for(i=0; i<length; i++) {
        key=arr[i];
        for(j=i-1; j>=0; j--) {
            if (arr[j]>key) {
                arr[j+1]=arr[j];
            } else {
                break;
            }
        }
        arr[j+1]=key;
    }
}

选择排序

选择排序原理:首先找出最小值,然后放在数列的最前面,如此反复。

原理示意图:

1396752-20180712155638040-191882328.gif

选择排序的平均情况时间复杂度为\(O(n^2)\)

代码如下

void Selection_Sort(int a[],int length){
    for(int i=0;i<n;i++){
        int k=i;
        for(int j=i;j<n;j++){
            if(a[j]<a[k]){
                k=j;
            }
        }
        int t=a[i];
        a[i]=a[k];
        a[k]=t;
    }
}

桶排序

设一个数组为桶,数组的大小为待排序数列的最大值加1,桶号即为数列的每一个值,当出现这个数时,对应的桶就加1。

原理示意图:

1396752-20180712161127569-1369475575.gif

桶排序的平均情况时间复杂度为\(O(n)\),但空间复杂度为\(O(n)\)

代码:

void Bucket_Sort(int a[], int max, int length) {
    int B[max+1]= {0};
    int i,j,count=0;
    for (i=0; i<length; i++) {
        B[a[i]]+=1;
    }
    for(i=0; i<=max; i++) {
        if (B[i]>0) {
            for(j=0; j<B[i]; j++) {
                a[count]=i;
                count++;
            }
        }
    }
}

终极の排序

不需要任何算法,直接一个函数搞定!

sort(a+1,a+1+n)

别忘了加这个头文件:

#include<algorithm>

还可以通过写一个函数来决定从大到小排还是从小到大排。

转载于:https://www.cnblogs.com/Steve-bm/articles/9300016.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值