zoukankan      html  css  js  c++  java
  • 排序算法积累(3)-----快速排序

    一. 快速排序思路

      1. 快速排序首先在所需要排序的数据中随机地选出一个数作为阀值,并把这个数(也就是这个阀值)与原来数据中最后的一个数交换,到了这步,数据中最后的一个数就是这个阀值了。

      2. 然后从头开始,将数据一个一个地与这个阀值作比较,小于这个阀值的数,放在左边,等于这个阀值的数不用理,大于这个阀值的数放在右边,这样就可以将数据分成小于等于大于三个

          区间了。注意每个区间里的数据是乱序的。

      3. 最后从复步骤2(也就是递归)。

    二. 程序

    #include <iostream> 
    #include <cstdio>
    #include <cstdlib>    
    #include <time.h>  
    #include <algorithm>
    
    using namespace std;
    void swap(int arr[], int i, int j) {           //交换函数
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
    
    int* partition(int arr[], int l, int r) {       //划分区间函数
        int less = l - 1;
        int more = r;
        while (l < more) {
            if (arr[l] < arr[r]) {      //小于阀值的区间
                swap(arr, ++less, l++);
            }
            else if (arr[l] > arr[r]) {         //大于阀值的区间
                swap(arr, --more, l);
            }
            else {             //等于阀值的区间
                l++;
            }
        }
        swap(arr, more, r);
        return new int[]{less + 1, more};
    }
    
    void quickSort(int arr[], int l, int r) {        //快速排序函数
        if (l < r) {
            swap(arr, l + (int)(rand() / double(RAND_MAX) * (r - l + 1)), r);
            int *p = partition(arr, l, r);
            quickSort(arr, l, p[0] - 1);    //递归调用
            quickSort(arr, p[1] + 1, r);     //递归调用
        }
    }
    
    
    
    int main(){
        int arr1[6] = { 6, 2, 3, 5, 3,9};
        srand((unsigned)time(0));
        quickSort(arr1, 0, 5); //排序,PS:范围是0到数组长度减一
        for (int i = 0; i < 6; i++)
        {
            cout << arr1[i] << ' ';
        }
        cout << endl;
        return 0;
    }

     

  • 相关阅读:
    准确率99.9%的离线IP地址定位库
    手写一个消息队列以及延迟消息队列
    rabbitmq介绍
    污点和亲和力高级调度方式
    ceph
    Vue作业
    label和labelSeletor
    http状态简记
    数据库
    作业
  • 原文地址:https://www.cnblogs.com/panlangen/p/7879114.html
Copyright © 2011-2022 走看看