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;
    }
  • 相关阅读:
    简单计算器(栈和队列的应用)
    01背包问题(dfs+剪枝)
    PAT1057 stack(分块思想)
    算法笔记求序列A每个元素左边比它小的数的个数(树状数组和离散化)
    求序列A中每个数的左边比它小的数的个数(树状数组)
    ubuntu-创建python虚拟环境
    vue-打包
    django-项目目录结构
    接口自动化-常见工具
    selenium-封装一个browser
  • 原文地址:https://www.cnblogs.com/huwt/p/10924464.html
Copyright © 2011-2022 走看看