• 快速排序


    快速排序(Quick Sort)是对冒泡排序的一种改进,基本思想是选取一个数作为关键字 key_value ,经过一趟排序,将整段序列分为两个部分,其中一部分的值都小于关键字,另一部分都大关键字。然后继续对这两部分继续进行排序,从而使整个序列达到有序。

    递归实现方法:

    void quick_sort(int arr[], int left, int right)
    {
        if (left >= right)
            return;
        int div = sort_operate(arr, left, right);  //执行sort_operate()后,此时div左边的元素都小于arr[div],右边的元素都小于arr[div],一次排序完成
        quick_sort(arr, left, div-1);  //递归的对div两边的数列执行sort_operate()
        quick_sort(arr, div+1, right);
    }

    左右指针法排序过程:

    需要注意,如果以左边第一个元素为基准点,则先移动右边指针。如果以右边第一个元素为基准点,则先移动左边指针

    int sort_operate(int arr[], int left, int right)
    {
        int key = left;
        int key_value = arr[key];
        while (left < right)
        {
            while (left < right && arr[right] >= key_value)
                right--;
            while (left < right && arr[left] <= key_value)
                left++;
            swap(arr[right], arr[left]);
        }
        swap(arr[key], arr[left]);
        return left;
    }

    填坑法排序过程:

    //填坑法
    int sort_operate_(int arr[], int left, int right)
    {
        int key_value = arr[left];
        while (left < right)
        {
            while (left < right && arr[right] >= key_value)
                right--;
            arr[left] = arr[right];
            while (left < right && arr[left] <= key_value)
                left++;
            arr[right] = arr[left];
        }
        arr[left] = key_value;
        return left;
    }

    全部代码如下:

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int sort_operate(int arr[], int left, int right)
    {
        int key = left;
        int key_value = arr[key];
        while (left < right)
        {
            while (left < right && arr[right] >= key_value)
                right--;
            while (left < right && arr[left] <= key_value)
                left++;
            swap(arr[right], arr[left]);
        }
        swap(arr[key], arr[left]);
        return left;
    }
    
    void quick_sort(int arr[], int left, int right)
    {
        if (left >= right)
            return;
        int div = sort_operate(arr, left, right);
        quick_sort(arr, left, div-1);
        quick_sort(arr, div+1, right);
    }
    
    int main()
    {
        int n;
        cout << "Please input the number of arr: " << endl;
        cin >> n;
        int* arr = new int(n);
        cout << "Please input the element of arr (separate by space): " << endl;
        for (int i = 0; i < n; i++)
            cin >> arr[i];
    
        quick_sort(arr, 0, n-1);
    
        for (int i = 0; i < n; i++)
            cout << arr[i] << ' ';
        cout << endl;
    
        return 0;
    }
  • 相关阅读:
    Mongodb_文件存储
    Mongodb_技巧
    Blend_Effect
    WPF_界面_图片/界面/文字模糊解决之道整理
    ASP.NET Boilerplate 深入系列之:概述
    P1280 尼克的任务
    P1802 5倍经验日
    271. 杨老师的照相排列
    P1726 上白泽慧音
    P1983 [NOIP2013 普及组] 车站分级
  • 原文地址:https://www.cnblogs.com/huwt/p/10924464.html
Copyright © 2020-2023  润新知