常用排序

常用排序手写一下

 

时间复杂度O(_n{2})的算法:

1. 选择排序:  

   首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到已排序序     列的末尾。以此类推,直到所有元素均排序完毕。

void sort(vector<int> &arr){
    int len = arr.size();
    for(int i = 0; i < len; ++i)
        for(int j = i + 1; j < len; ++j)
            if(arr[j] < arr[i])swap(arr[j], arr[i]);
}

2. 冒泡排序:

   外循环为排序趟数,len个数进行len-1趟,内循环为每趟比较的次数,第i趟比较len-i次,相邻元素比较,若逆序则交换。

void sort(vector<int> &arr){
    int len = arr.size();
    for(int i = 0; i < len - 1; ++i)
        for(int j = 0; j < len - i - 1; ++j)
            if (arr[j + 1] < arr[j]) swap(arr[j], arr[j + 1]);
}

3. 插入排序:

将当前元素与前面以构建好的有序序列比较,插入到合适位置。最初有序可以看成是第一个元素。

void sort(vector<int> &arr){
    int len = arr.size();
    for(int i = 1; i < len; ++i)
        for(int j = i - 1; j >= 0 && arr[j + 1] < arr[j]; --j)
            swap(arr[j], arr[j + 1]);
}

时间复杂度O(nlog_{2}n)的算法:

4. 快速排序:

  选择一个关键数,比关键数小的放前面,比关键数大的放到后面,然后对关键数前面的序列和关键数后面的序列分别进行快速排序。

void sort(vector<int> &arr, int l, int r){
    if (l >= r) return;
    int key = arr[l], i = l, j = r;
    while(i < j){
        while(i < j && arr[j] >= key) --j;
        arr[i] = arr[j];
        while(i < j && arr[i] <= key) ++i;
        arr[j] = arr[i];
    }
    arr[i] = key;
    sort(arr, l, i - 1);
    sort(arr, i + 1, r);
}

5. 归并排序:

对于两个有序的子序列进行合并。

void sort(vector<int> &arr, int l, int r){
    if (l >= r) return;
    int mid = (l + r) / 2;
    sort(arr, l, mid);
    sort(arr, ++mid, r);
    vector<int> temp;
    int i = l, j = mid;
    while(i < mid || j <= r){
        if (j > r || (i < mid && arr[i] <= arr[j]))  temp.push_back(arr[i++]);
        else  temp.push_back(arr[j++]);
    }
    for(i = l; i <= r; ++i) arr[i] = temp[i - l];
}

6.堆排序:
  建立一个最大堆,然后每次选出堆顶与堆尾进行交换,将堆的数量减一后,重新维护堆,重复以上操作即可

void max_heap(vector<int> &arr, int d, int len){
    while(d < len){
        int son = d * 2 + 1;
        if (son + 1 < len && arr[son] < arr[son + 1])
            ++son;
        if (son < len && arr[d] < arr[son]){
            swap(arr[d], arr[son]);
            d = son;
        }
        else return;
    }
}
void sort(vector<int> &arr){
    int len = arr.size();
    for(int i = len / 2 - 1; i >= 0; --i)
        max_heap(arr, i,len);
    for(int i = len - 1; i > 0; --i){
        swap(arr[i], arr[0]);
        max_heap(arr, 0, i);
    }
}

7. 希尔排序:

  确定一个增量d,每次按照d来分组进行插入排序,最后d=1时,排序完成。

void sort(vector<int> &arr){
    int len = arr.size();
    int d = 1;
    while(d < len) d = d * 3 + 1;
    while(d >= 1){
        for(int i = d; i < len; ++i)
            for(int j = i; j >= d && arr[j] < arr[j - d]; j -= d)
                swap(arr[j], arr[j - d]);
        d /= 3;
    }
}

时间复杂度O(N+d)的算法:

8. 计数排序:

void sort(vector<int> &arr){
    int len = arr.size();
    int maxn = 0, k = 0;
    for (int i = 0; i < len; ++i) maxn = max(maxn, arr[i]);
    int *b = new int[maxn + 1];
    for(int i = 0; i <= maxn; ++i) b[i] = 0;
    for(int i = 0; i < len; ++i) ++b[arr[i]];
    for(int i = 0; i <= maxn; ++i) while(b[i]--) arr[k++] = i;
}

9. 桶排序:

  先从个位开始:将每个元素的个位装到桶中,将其按照顺序排到序列中,然后从低到高将每一位(十位,百位。。)进行室上述进行入桶排序,当然桶内要清空。

void sort(vector<int> &arr){
    int len = arr.size();
    int maxn = 0, num = 0, div = 1;
    for (int i = 0; i < len; ++i) maxn = max(maxn, arr[i]);
    while(maxn) ++num, maxn /= 10;

    while(num--){
        vector<int> b[10];
        for(int i = 0; i < len; ++i){
            int d = arr[i] / div % 10;
            b[d].push_back(arr[i]);
        }
        int k = 0;
        for(int i = 0; i < 10; ++i){
            int blen = b[i].size();
            for (int j = 0; j < blen; ++j){
                arr[k++] = b[i][j];
            }
        }
        div *= 10;
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值