快速排序和归并排序

快速排序

  1. 算法:关键就在于 pivot在排序之前就拿出来,空一个位置,然后左右指针交替扫描,遇到不符合情况的就把那个不符合的数字放到空位置,直至左右指针重合,在排序过程中pivot是一直在序列之外的,在一趟排序之后再把pivot放回唯一的空位置就行

  2. 代码

    void fast(vector<int>& arr, int low, int high)
    {
        if (low >= high)
            return;
        int temp = arr[low];
        int i = low;
        int j = high;
        while (low < high)
        {
            while (arr[high] > temp && low < high)
                high--;
            if(low<high) arr[low++] = arr[high];
            while (arr[low] < temp && low < high)
                low++;
            if(low<high) arr[high--] = arr[low];
        }
        arr[low] = temp;
        fast(arr, i, low - 1);
        fast(arr, low + 1, j);
    }
    
  3. 优化

    1. 选取pivot,应选取较中间的,而不是最大值和最小值

归并排序

  1. 算法:分治

  2. 代码:

    `#include <iostream>
    using namespace std;
    void Merge(int arr[], int low, int mid, int high);
    void MergeSort(int arr[], int low, int high) {
        if (low >= high) { return; } // 终止递归的条件,子序列长度为1
        int mid = low + (high - low) / 2;  // 取得序列中间的元素
        MergeSort(arr, low, mid);  // 对左半边递归
        MergeSort(arr, mid + 1, high);  // 对右半边递归
        Merge(arr, low, mid, high);  // 合并
    }
    void Merge(int arr[], int low, int mid, int high) {
        //low为第1有序区的第1个元素,i指向第1个元素, mid为第1有序区的最后1个元素
        int i = low, j = mid + 1, k = 0;  //mid+1为第2有序区第1个元素,j指向第1个元素
        int* temp = new int[high - low + 1]; //temp数组暂存合并的有序序列
        while (i <= mid && j <= high) {
            if (arr[i] <= arr[j]) //较小的先存入temp中
                temp[k++] = arr[i++];
            else
                temp[k++] = arr[j++];
        }
        while (i <= mid)//若比较完之后,第一个有序区仍有剩余,则直接复制到t数组中
            temp[k++] = arr[i++];
        while (j <= high)//同上
            temp[k++] = arr[j++];
        for (i = low, k = 0; i <= high; i++, k++)//将排好序的存回arr中low到high这区间
            arr[i] = temp[k];
        delete[]temp;//释放内存,由于指向的是数组,必须用delete []
    }
    int main()
    {
        int arr[] = { 1,3,5,0,22,33 };
        MergeSort(arr, 0, 5);
        for (int i = 0; i <= 5; i++)
        {
            cout << arr[i] << endl;
        }
    }`
    
posted @ 2022-11-07 15:42  5hithin  阅读(24)  评论(0)    收藏  举报