排序算法积累(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;
}

 

 

posted @ 2017-11-22 14:39  P_langen  阅读(139)  评论(0编辑  收藏  举报