1. 程式人生 > >排序算法積累(3)-----快速排序

排序算法積累(3)-----快速排序

快速排序 函數 一個數 rand sig 圖片 大於 void oid

一. 快速排序思路

  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; }

技術分享圖片

排序算法積累(3)-----快速排序