美文网首页
[算法] 排序

[算法] 排序

作者: 舒也ella | 来源:发表于2019-01-15 20:15 被阅读0次
  • 插入排序 O(n^2)
void insertSort(vector<uint>& A) {
    for (int j = 1; j < A.size(); j++) {
        uint x = A[j];
        int i = j - 1;
        while (i >= 0 && A[i] > x) {
            A[i+1] = A[i];
            i--;
        }
        A[i+1] = x;
    }
}
  • 希尔排序
    缩小增量排序:先取一个正整数 d1(d1 < n),把全部记录分成 d1 个组,所有距离为 d1 的倍数的记录看成一组,然后在各组内进行插入排序,然后取 d2(d2 < d1)重复上述分组和排序操作;直到取 di = 1(i >= 1) 位置,即所有记录成为一个组,最后对这个组进行插入排序。一般选 d1 约为 n/2,d2 为 d1 /2, d3 为 d2/2 ,…, di = 1,最坏时间复杂度O(n^2),优化Gap值可使得时间复杂度O(n log^2 n)
    不稳定!
void shellSort(vector<uint>& A) {
    int n = (int)A.size();
    for (int gap = n/2; gap > 0; gap /= 2)
    {
        for (int j = gap; j < n; j++) {
            uint x = A[j];
            int i = j - gap;
            while (i >= 0 && A[i] > x) {
                A[i + gap] = A[i];
                  i -= gap;
            }
            A[i + gap] = x;
        }
    }

}
  • 归并排序
void merge(vector<uint>& A, int p, int q, int r) {
    vector<uint> L;
    L.reserve(q-p+1);
    vector<uint> R;
    R.reserve(r-q);
    for (int i = p; i <= q; i++) {
        L.push_back(A[i]);
    }
    for (int i = q+1; i <= r; i++) {
        R.push_back(A[i]);
    }
    int i = 0, j = 0, k = p;
    while (i < L.size() && j < R.size()) {
        if (L[i] <= R[j]) {
            A[k++] = L[i++];
        } else {
            A[k++] = R[j++];
        }
    }
    while (i < L.size()) {
        A[k++] = L[i++];
    }
    while (j < R.size()) {
        A[k++] = R[j++];
    }
}

void mergeSort(vector<uint>& A, int p, int r) {
    if (p < r) {
        int q = (p + r) / 2;
        mergeSort(A, p, q);
        mergeSort(A, q+1, r);
        merge(A, p, q, r);
    }
}
  • 堆排序

    max-heapify(A, i)
    通过与I的左右子节点比较让A[I]的值逐级下降 O(lgn)
    build-heap(A)
    for I=A.length/2 to 1
    max-heapify(A, i)
    利用n/2+1...n均为叶子节点的特点将时间复杂度降为 O(n)
    Heapsort(A)
    首尾交换
    断尾重构
    不稳定!
  • 快速排序
    虽然实际复杂度相等,但快速排序仍然比较快,因为堆排序是缓存不友好的,而相较于归并排序,快速排序是就地排序,没有归并额外的分配和销毁数组的开销
    不稳定!
  • 计数排序
void countSort(vector<uint>& A, uint place) {
    int n = (int)A.size();
    vector<uint> output(n, 0);
    vector<uint> count(10, 0);
    for (int i = 0; i < n; i++) {
        count[(A[i] / place) % 10]++;
    }
    for (int i = 1; i < 10; i++) {
        count[i] += count[i-1];
    }
    for (int i = n-1; i >= 0; i--) {
        output[count[(A[i] / place) % 10] - 1] = A[i];
        count[(A[i] / place) % 10]--;
    }
    for (int i = 0; i < n; i++) {
        A[i] = output[i];
    }
}

稳定 O(n+k)

  • 基数排序
void radixSort(vector<uint>& A, uint max) {
    
    uint place = 1u;
    int d = 1;
    uint p = 10u;
    while (max >= p)
    {
        max /= 10u;
        ++d;
    }
    for (int i = 0; i < d; i++) {
        countSort(A, place);
        place *= 10;
    }
}

相关文章

  • java实现快速排序、归并排序、希尔排序、基数排序算法...

    快速排序算法 归并排序算法 希尔排序算法 基数排序算法

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • 算法学习(1)-排序算法

    八大排序算法九大排序算法再总结[经典排序算法][集锦][直观学习排序算法] 视觉直观感受若干常用排序算法 快速排序...

  • 经典排序算法总结

    经典排序算法集锦 冒泡法 排序算法入门之冒泡排序 排序算法入门之冒泡排序优化

  • 前端算法学习-第一篇

    冒泡排序算法 冒泡排序算法是最慢的排序算法之一,也是最容易实现的排序算法。之所以叫冒泡排序是因为使用这种算法排序时...

  • 七大排序算法之冒泡排序

    七大排序算法之冒泡排序 @(算法笔记)[排序算法, 冒泡排序, C++实现] 冒泡排序介绍 冒泡排序是七大排序算法...

  • 算法-选择排序

    算 法:选择排序算法时间复杂度: 选择排序算法概述 选择排序伪代码 选择排序实现 选择排序算法概述 排序算法有许...

  • 浅谈排序算法

    排序算法有很多种,今天先谈谈一些简单的排序算法。包括桶排序、冒泡排序和快速排序算法。后期总结各种排序算法。 桶排序...

  • 线性排序

    桶排序、计数排序、基数排序 一、线性排序算法介绍 1.线性排序算法包括桶排序、计数排序、基数排序。2.线性排序算法...

  • 算法4:插入排序和选择排序算法的比较

    排序算法列表电梯: 选择排序算法:详见 《算法4》2.1 - 选择排序算法(Selection Sort), Py...

网友评论

      本文标题:[算法] 排序

      本文链接:https://www.haomeiwen.com/subject/graqdqtx.html