美文网首页
各种排序算法

各种排序算法

作者: junjie_0402 | 来源:发表于2022-07-19 14:52 被阅读0次

#include <iostream>
#include <vector>
using namespace std;

// 打印 vector
void printVector(vector<int> &valVec) {
    for (int i = 0; i< valVec.size(); i++) {
        printf("%d ", valVec[i]);
    }
}

// 构造待排序数组
vector<int> constructVec() {
    vector<int> vec;
    vec.push_back(6);
    vec.push_back(2);
    vec.push_back(1);
    vec.push_back(9);
    vec.push_back(5);
    return vec;
}

// 冒泡排序
void bubbleSort(vector<int> &vec) {
    if (vec.size() <= 1) {
        return;
    }
    
    int len = (int)vec.size();
    for (int i = 0; i < len - 1; i++) { /// n - 1 轮,每轮将最大的数挪到最后!!!
        for (int j = 0; j < len - 1 - i; j++) { // 注意这里减去 i
            if (vec[j] > vec[j+1]) {
                int tmp = vec[j];
                vec[j] = vec[j+1];
                vec[j+1] = tmp;
            }
        }
    }
}

// 选择排序
void selectionSort(vector<int> &vec) {
    if (vec.size() <= 1) {
        return;
    }
    
    int len = (int)vec.size();
    for (int i = 0; i < len; i ++) { /// n 轮,每轮获取最小的树放在最前!!!
        int minIndex = i;
        for (int j = i + 1; j < len; j++) {
            if (vec[j] < vec[minIndex]) {
                minIndex = j;
            }
        }
        int tmp = vec[minIndex];
        vec[minIndex] = vec[i];
        vec[i] = tmp;
    }
}

// 插入排序(折半排序):https://www.runoob.com/w3cnote/insertion-sort.html
void insertSort(vector<int> &vec) {
    /// 每轮将后一个元素插入到前面已排序的数组中!!!
    for (int i = 1; i < vec.size(); i++) {
        int elementI = vec[i];
        int j = i - 1;
        // 如果 elementI 比前面的小,就 elementI 一直往前挪(其他元素往后一个位置挪)
        while(j >= 0 && vec[j] > elementI) {
            vec[j + 1] = vec[j];
            j--;
        }
        vec[j + 1] = elementI;
    }
}

// 归并排序:https://blog.csdn.net/weixin_54913371/article/details/119654906
void innerMergeSort(vector<int> &vec, int start, int mid, int end) {
    int i = start;
    int j = mid + 1;
    
    // 合并两个排序数组,放在tmp数组中
    vector<int> tmp(end - start + 1);
    int k = 0;
    while (i <= mid && j <= end) {
        if (vec[i] < vec[j]) {
            tmp[k] = vec[i];
            k++;
            i++;
        } else {
            tmp[k] = vec[j];
            k++;
            j++;
        }
    }
    
    while (i <= mid) {
        tmp[k] = vec[i];
        k++;
        i++;
    }
    
    while (j <= end) {
        tmp[k] = vec[j];
        k++;
        j++;
    }
    
    // 合并后放回原数组容器中
    for (int l = 0; l < k; l++) {
        vec[start] = tmp[l];
        start++;
    }
}

void mergeSort(vector<int> &vec, int start, int end) {
    if (start == end) {
        return;
    }
    int mid = (start + end) / 2;
    mergeSort(vec, start, mid);
    mergeSort(vec, mid + 1, end);
    innerMergeSort(vec, start, mid, end);
}

// 快速排序:https://www.runoob.com/w3cnote/quick-sort.html
// 基本思想是找一个基准值,把小于基准值的放在其左侧,大于基准值的放在右侧。然后针对左右两侧递归重复刚才的操作
void quickSort(vector<int> &vec, int start, int end) {
    if (start < end) {
        int i = start;
        int j = end;
        int first = vec[i];
        
        while(i < j) {
            // 从右往左找,找到一个比 first 小的值
            while (j > i && vec[j] >= first) {
                j--;
            }
            if (j > i) {
                vec[i] = vec[j];
                i++;
            }
            
            // 从左往右找,找到一个比 first 大的值
            while (j > i && vec[i] <= first) {
                i++;
            }
            if (j > i) {
                vec[j] = vec[i];
                j--;
            }
        }
        vec[i] = first;
        quickSort(vec, 0, i - 1);
        quickSort(vec, i + 1, end);
    }
}

// 堆排序
// 堆的概念介绍(聚焦最大堆,内含堆插入节点,删除节点):https://www.cnblogs.com/skywang12345/p/3610187.html
// 堆排序的实现(说得很详细清晰,内含c++算法代码):https://www.jianshu.com/p/938789fde325
// 堆排序的步骤:1、构造最大堆。2、每次将最大元素挪到数组末,然后再将前面的元素调整为最大堆

void adjustHeap(vector<int> &vec, int rootIndex, int len) {
    int childIndex = 2 * rootIndex + 1;
    int rootValue = vec[rootIndex];
    while (childIndex < len) {
        // 挑选左右子节点最大的那个
        if (childIndex + 1 < len && vec[childIndex + 1] > vec[childIndex]) {
            childIndex++;
        }
        
        // 看看父节点和最大的子节点是否需要交换
        if (rootValue >= vec[childIndex]) {  // 无需交换
            break;
        } else {
            int tmp = rootValue;
            vec[rootIndex] = vec[childIndex];
            vec[childIndex] = tmp;
            
            // 根节点下沉后的子节点,作为新的一轮根节点,继续看看是否需要下沉
            rootIndex = childIndex;
            childIndex = 2 * rootIndex + 1;;
        }
        
    }
}

void headSort(vector<int> &vec) {
    int len = (int)vec.size();
    
    // 构造最大堆
    for (int i = len / 2; i >= 0; i--) {
        adjustHeap(vec, (int)i, (int)len);
    }
    
    for (int i = len - 1; i > 0; i--) {
        // 将最大元素挪到数组末
        int tmp = vec[i];
        vec[i] = vec[0];
        vec[0] = tmp;
        
        // 调整除最大元素的其他元素为最大堆
        adjustHeap(vec, 0, (int)i);
    }
}

int main(int argc, const char * argv[]) {
    
    std::cout << "\n\n冒泡排序------ \n";
    vector<int> vec1 = constructVec();
    bubbleSort(vec1);
    printVector(vec1);
    
    std::cout << "\n\n选择排序------ \n";
    vector<int> vec2 = constructVec();
    selectionSort(vec2);
    printVector(vec2);
    
    std::cout << "\n\n插入排序------ \n";
    vector<int> vec3 = constructVec();
    insertSort(vec3);
    printVector(vec3);
    
    std::cout << "\n\n快速排序------ \n";
    vector<int> vec4 = constructVec();
    quickSort(vec4, 0, (int)(vec4.size() - 1));
    printVector(vec4);
    
    std::cout << "\n\n归并排序------ \n";
    vector<int> vec5 = constructVec();
    mergeSort(vec5, 0, (int)vec5.size() - 1);
    printVector(vec5);
    
    std::cout << "\n\n堆排序------ \n";
    vector<int> vec6 = constructVec();
    headSort(vec6);
    printVector(vec6);
    
    std::cout << "\n\n结束程序------ \n";
    
    return 0;
}

相关文章

  • 浅谈排序算法

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

  • Object-C实现常见十大算法(冒泡、选择、归并、双路、三路.

    我们经常会在时项目使用各种算法,比如排序.排序算法是最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排...

  • 各种排序算法

    1.冒泡排序 1.有多少趟2.每趟向前产生一个最大数 2.插入排序 1.顺序遍历每个数字2.每遍历一个数字,就向前...

  • 各种排序算法

    排序算法包括很多,常见的有快排,堆排序,冒泡排序,归并排序,选择排序,插入排序等, 各种排序算法经常出现在面试题中...

  • 各种排序算法

    1.冒泡排序 通过与相邻元素的比较和交换,把小的数交换到前面。 对数组【12,5,3,2】进行升序排列 第一处理了...

  • 各种排序算法

    冒泡排序 从第一个数开始,相邻两个数比较,前一个大于后一个,则调换,重复这个过程。代码实现:python: 嵌套循...

  • 各种排序算法

    https://zhuanlan.zhihu.com/p/27005757

  • 各种排序算法

  • 常用排序算法实现

    1、常见排序算法大致有以下几种:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序2、各种排序算法...

  • 排序算法

    常见排序算法比较 参考资料:各种排序算法比较 参考资料:快速排序算法 必须知道的八大种排序算法【java实现】(一...

网友评论

      本文标题:各种排序算法

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