美文网首页
7种排序代码总结

7种排序代码总结

作者: StormZhu | 来源:发表于2018-08-28 21:30 被阅读0次

冒泡排序

// 冒泡排序
template <typename T>
void bubbleSort(vector<T>& arr)
{
    int n = (int)(arr.size());
    for(int i=0;i<n-1;i++){
        for(int j=0;j<n-i-1;j++){
            if(arr[j] > arr[j+1])
                swap(arr[j], arr[j+1]);
        }
    }
}

选择排序

// 选择排序
template <typename T>
void selectSort(vector<T>& arr)
{
    int n = (int)(arr.size());
    for(int i=0;i<n-1;i++) {
        int minId = i; // 从i开始最小的数的索引
        for(int j=i+1;j<n;j++){
            if(arr[j] < arr[minId])
                minId = j;
        }
        swap(arr[i], arr[minId]);
    }
}

插入排序

// 插入排序
template <typename T>
void insertSort(vector<T>& arr)
{
    int n = (int)(arr.size());
    for(int i=1;i<n;i++){
        for(int j=i;j>0;j--){
            if(arr[j] >= arr[j-1])
                break;
            swap(arr[j], arr[j-1]);
        }
    }
}

// 插入排序 优化版
template <typename T>
void insertSort2(vector<T>& arr)
{
    int n = (int)(arr.size());
    for(int i=1; i<n; i++){
        T e = arr[i]; // 该元素需要放在合适的位置
        int j; // e应该放在j这个位置
        for(j=i; j>0 && arr[j-1] > e; j--){
            arr[j] = arr[j-1];
        }
        arr[j] = e;
    }
}

希尔排序

// 希尔排序
template <typename T>
void shellSort(vector<T>& arr)
{
    int n = (int)(arr.size());
    for(int gap=n/2;gap>0;gap/=2){
        //内部使用插入排序
        for(int i=gap;i<n;i++){
            for(int j=i;j-gap>=0;j-=gap) {
                if(arr[j] >= arr[j-gap])
                    break;
                swap(arr[j], arr[j-gap]);
            }
        }
    }
}

归并排序

// 归并排序 递归版
template <typename T>
void _merge(vector<T>& arr, vector<int>& aux, int left, int right, int mid)
{
    // 复制一份出来
    for(int i=left; i<=right; i++) {
        aux[i] = arr[i];
    }
    int i = left;
    int j = mid+1;
    for(int k=left;k<=right;k++) {
        if(i>mid) {
            arr[k] = aux[j];
            j++;
        }
        else if(j>right) {
            arr[k] = aux[i];
            i++;
        }
        else if(aux[i] < aux[j] ) {
            arr[k] = aux[i];
            i++;
        }
        else {
            arr[k] = aux[j];
            j++;
        }
    }
}

// [left, right]
template <typename T>
void _mergeSort(vector<T>& arr, vector<T>& aux, int left, int right)
{
    if(left >= right)
        return;

    int mid = left + (right-left)/2;

    _mergeSort(arr, aux, left, mid); // [left, mid]
    _mergeSort(arr, aux, mid+1, right); // [mid+1, right]
    _merge(arr, aux, left, right, mid);
}

template <typename T>
void mergeSort(vector<T>& arr)
{
    vector<T> aux = arr; //辅助数组
    int n = int(arr.size());
    _mergeSort(arr, aux, 0, n-1);
}

三路快排

// [left, right]
template <typename T>
void _quickSort3Ways(vector<T>& arr, int left, int right)
{
    if(left >= right)
        return;
    int randId = rand() % (right-left+1)+left;
    swap(arr[left], arr[randId]);
    //当前位置是i, 第一个=的位置是j
    T pivot = arr[left];
    int i = left+1;
    int j = left+1;
    int k = right;
    while(i<=k){
        if(arr[i] > pivot) {
            swap(arr[i], arr[k]);
            k--;
        }
        else if(arr[i] < pivot) {
            swap(arr[i], arr[j]);
            i++;
            j++;
        }
        else {
            i++;
        }
    }
    swap(arr[j-1], arr[left]);
    _quickSort3Ways(arr, left, j-1);
    _quickSort3Ways(arr, k+1, right);

}

template <typename T>
void quickSort3Ways(vector<T>& arr)
{
    int n = (int)(arr.size());
    _quickSort3Ways(arr, 0, n-1);
}

堆排序

// i表示要调整的索引 n表示数组长度
template <typename T>
void adjust(vector<T>& arr, int i, int n)
{
    //只需要保证有左孩子,如果没有,啥都不用做
    while(2*i+1<n) {
        //判断左右选择那一边
        int k = 2*i+1;
        //如果有右孩子,就和左孩子比一下,选择更大的孩子
        if(k+1<n && arr[k] < arr[k+1])
            k += 1;

        if(arr[i] >= arr[k])
            break;

        swap(arr[i], arr[k]);
        i = k;
    }
}

template <typename T>
void heapSort(vector<T>& arr)
{
    int n =(int)(arr.size());
    // 变成一个最大堆
    for(int i=n/2 - 1;i>=0;i--) {
        adjust(arr, i, n);
    }

    //k表示数组长度
    for(int k=n-1;k>0;k--){
        swap(arr[0], arr[k]);
        adjust(arr, 0, k); //重新调整
    }
}

相关文章

  • 排序算法最强总结及其代码实现(Python/Java)

    前言 本文总结了常用的全部排序算法,内容包括: 排序算法的定义和思路 排序算法的代码实现:Python和Java,...

  • 常用排序算法

    常用的排序算法 在此总结一下常用排序算法的代码实现 #include using namespace std;t...

  • 11种排序总结

    以下是个人总结的各类排序代码:一:非线性排序(适合大n排序):1.交换-冒泡: 1.交换-冒泡优化版(在之后的排序...

  • 普林斯顿大学算法Week3:CollinearPoints共线模

    Welcome To My Blog 总结 (代码有详细注释) 本课讲了归并排序,作业应用是排序进行共线的模式识别...

  • 排序算法

    排序 1. 选择排序 代码实现 2. 插入排序 代码实现 3. 冒泡排序 代码实现 4. 快速排序 代码实现

  • 排序算法

    十大经典排序算法最强总结(含JAVA代码实现) - 郭耀华 - 博客园 1、冒泡排序 前后比较 一轮排序 最后一个...

  • 插入排序与选择排序

    代码(插入排序) 代码(选择排序)

  • 《算法》笔记 3 - 选择排序、插入排序、希尔排序

    排序通用代码 选择排序 插入排序 希尔排序 排序通用代码 通用代码支持任意实现了Comparable接口的数据类型...

  • 10个常见的排序算法总结

    10个常见的排序(冒泡,插入,快速,归并,堆,希尔,计数,桶,基数,选择排序)算法总结和参考的资源,代码使用OC实...

  • 算法

    分类 排序 希尔排序 代码实现 归并排序 代码实现 查找

网友评论

      本文标题:7种排序代码总结

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