• 归并排序和快速排序


    归并排序:将数组每次分成两部分分别排序,然后逐一合并

     



    1
    template<typename T> 2 void __merge(T arr[], int l, int mid, int r) { 3 int *aux = new int[r - l + 1];//开辟新的空间 4 for (int i = l; i <= r; i++) 5 aux[i - l] = arr[i]; 6 int i = l, j = mid + 1; 7 for (int k = l; k <= r; k++) { 8 if (i > mid) 9 { 10 arr[k] = aux[j - l]; 11 j++; 12 } 13 else if (j > r) { 14 arr[k] = aux[i - l]; 15 i++; 16 } 17 else if (aux[i - l] < aux[j - l]) 18 { 19 arr[k] = aux[i - l]; 20 i++; 21 } 22 else 23 { 24 arr[k] = aux[j - l]; 25 j++; 26 } 27 } 28 delete[] aux; 29 30 } 31 template<typename T> 32 void __mergeSort(T arr[], int l, int r) { 33 if (r - l <= 15) { 34 insertionSort(arr, l, r);//使用插入排序对其进行优化 35 return; 36 } 37 /*if(r-l<=15) { 38 insertionSort(arr,l,r); 39 return ; 40 } 41 */ 42 int mid = (l + r) / 2; 43 __mergeSort(arr, l, mid); 44 __mergeSort(arr, mid + 1, r); 45 if (arr[mid]>arr[mid + 1])//对近乎有序的数组的优化 46 __merge(arr, l, mid, r); 47 } 48 template<typename T> 49 void mergeSort(T arr[], int n) { 50 __mergeSort(arr, 0, n - 1); 51 } 52 template<typename T> 53 void mergeSortBU(T arr[], int n) {//自底向上排序 54 for (int sz = 1; sz <= n; sz += sz) 55 for (int i = 0; i + sz < n; i += sz + sz) 56 __merge(arr, i, i + sz - 1, min(n - 1, i + sz + sz - 1)); 57 }

    快速排序:将数组分成两部分,使得组边部分小于标准,右边部分大于标准,这样就将标准元素放到了排序数组正确的位置

     1 template<typename T>//找到一个索引使得arr[l...p-1]<v,arr[p+1..r]>v,这样v就在恰当的位置了
     2 int  __partition(T arr[], int l, int r) {
     3     swap(arr[l], arr[rand() % (r - l + 1) + l]);//优化
     4 
     5     T v = arr[l];//一个标准两个索引
     6     int j = l;//使得arr[l+1...j] < v ; arr[j+1...i) > v,每次遇到小于v的元素进行交换, 扩充arr[l+1...j]的同时,将大于部分往后放
     7     for (int i = l + 1; i <= r; i++)
     8     {
     9         if (arr[i] < v) {
    10             j++;
    11             swap(arr[i], arr[j]);
    12         }
    13     }
    14     swap(arr[l], arr[j]);//将v放到恰当位置
    15     return j;
    16 }
    17 template<typename T>
    18 void __quickSort(T arr[], int l, int r) {
    19     if (r - l <= 15) {
    20         insertionSort(arr, l, r);
    21         return;
    22     }
    23     int p = __partition(arr, l, r);
    24     __quickSort(arr, l, p - 1);
    25     __quickSort(arr, p + 1, r);
    26 }

    27 template<typename T>//找到一个索引使得arr[l...p-1]<v,arr[p+1..r]>v,这样v就在恰当的位置了 28 int __partition2(T arr[], int l, int r) { 29 swap(arr[l], arr[rand() % (r - l + 1) + l]);//优化,对于近乎有序的数组,快速排序会退化成一个O(n2)级别的算法 30 31 T v = arr[l];//一个标准两个索引 32 int i = l + 1, j = r; 33 while (true) { 34 while (i <= r && arr[i] < v) 35 i++; 36 37 while (j >= l + 1 && arr[j] > v) 38 j--; 39 if (i>j) break; 40 swap(arr[i], arr[j]); 41 i++; 42 j--; 43 } 44 swap(arr[j], arr[l]); 45 return j; 46 } 47 template<typename T> 48 void __quickSort2(T arr[], int l, int r) { 49 if (r - l <= 15) { 50 insertionSort(arr, l, r); 51 return; 52 } 53 int p = __partition2(arr, l, r); 54 __quickSort2(arr, l, p - 1); 55 __quickSort2(arr, p + 1, r); 56 } 57 template<typename T> 58 void quickSort(T arr[], int n) { 59 srand(time(NULL)); 60 __quickSort2(arr, 0, n - 1); 61 }

    三路快排

     1 //三路快速排序
     2 template <typename T>
     3 void __quickSort3Ways(T arr[], int l, int r) {
     4 
     5     if (r - l <= 15) {
     6         insertionSort(arr, l, r);
     7         return;
     8     }
     9 
    10     swap(arr[l], arr[rand() % (r - l + 1) + l]);
    11 
    12     T v = arr[l];
    13 
    14     int lt = l;     // arr[l+1...lt] < v
    15     int gt = r + 1; // arr[gt...r] > v
    16     int i = l + 1;    // arr[lt+1...i) == v
    17     while (i < gt) {
    18         if (arr[i] < v) {
    19             swap(arr[i], arr[lt + 1]);
    20             i++;
    21             lt++;
    22         }
    23         else if (arr[i] > v) {
    24             swap(arr[i], arr[gt - 1]);
    25             gt--;
    26         }
    27         else { // arr[i] == v
    28             i++;
    29         }
    30     }
    31 
    32     swap(arr[l], arr[lt]);
    33 
    34     __quickSort3Ways(arr, l, lt - 1);
    35     __quickSort3Ways(arr, gt, r);
    36 }
    37 
    38 template <typename T>
    39 void quickSort3Ways(T arr[], int n) {
    40 
    41     srand(time(NULL));
    42     __quickSort3Ways(arr, 0, n - 1);
    43 }
  • 相关阅读:
    uni-app picker通用方法 多个picker公用一个bindPickerChange方法 通用的@change事件
    ElementUI Cascader 级联选择器 hover触发不好用以及图标不显示问题
    jquery 最简单的重置DIV内容,重置表单内容方法
    bootstrap table 表头与内容不对齐问题解决
    hbuilder mui html vue ul li 自定义循环赋值ID
    vue文件中提示Expected Boolean, got String
    hbuilder连接模拟器进行联调(逍遥模拟器,MuMu模拟器,夜神模拟器)
    网易mumu无法启动,只在任务栏有个图标
    pytest——pycharm中右击运行(run)没有问题,在terminal中运行pytest报错:E ModuleNotFoundError: No module named
    eclipse的TestNG运行不了——eclipse刚安装完TestNG,首次建立测试用例,但是一直运行出错的问题。
  • 原文地址:https://www.cnblogs.com/bingzzzZZZ/p/8453141.html
Copyright © 2020-2023  润新知