zoukankan      html  css  js  c++  java
  • 快速排序

    快速排序(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;
    }
  • 相关阅读:
    python中list/tuple/dict/set的区别
    jquery修改ajax的header的字段origin方法,均被浏览器拒绝
    js判断上传文件的大小、类型、修改日期等信息
    js调试方法
    sqlmapapi的跨域访问Access-Control-Allow-Origin:*;ajax
    flask的文件上传和下载
    flask中的g、add_url_rule、send_from_directory、static_url_path、static_folder的用法
    python读写csv时中文乱码问题解决办法
    css中!important的作用
    项目经验——Sql server 数据库的备份和还原____还原数据库提示“介质集有2个介质簇,但只提供了1个。必须提供所有成员” .
  • 原文地址:https://www.cnblogs.com/huwt/p/10924464.html
Copyright © 2011-2022 走看看