1. 程式人生 > >快速排序(C++實現)

快速排序(C++實現)

font std clu temp secure 最重要的 esp 代碼 else

快速排序的基本實現

快速排序算法是一種基於交換的高效的排序算法,它采用了分治法的思想:

1、從數列中取出一個數作為基準數(樞軸,pivot)。

2、將數組進行劃分(partition),將比基準數大的元素都移至樞軸右邊,將小於等於基準數的元素都移至樞軸左邊。

3、再對左右的子區間重復第二步的劃分操作,直至每個子區間只有一個元素。

快排最重要的一步就是劃分了。劃分的過程用通俗的語言講就是“挖坑”和“填坑”。

快速排序 實現一:

 1 int partition(int arr[], int left, int right)  //找基準數 劃分
 2 {
 3     int i = left + 1
; 4 int j = right; 5 int temp = arr[left]; 6 7 while(i <= j) 8 { 9 while (arr[i] < temp) 10 { 11 i++; 12 } 13 while (arr[j] > temp ) 14 { 15 j--; 16 } 17 if (i < j) 18 swap(arr[i++], arr[j--]);
19 else i++; 20 } 21 swap(arr[j], arr[left]); 22 return j; 23 24 } 25 26 void quick_sort(int arr[], int left, int right) 27 { 28 if (left > right) 29 return; 30 int j = partition(arr, left, right); 31 quick_sort(arr, left, j - 1); 32 quick_sort(arr, j + 1
, right); 33 }

快速排序 實現方法二:

 1 void QuickSort(int array[], int start, int last)
 2 {
 3     int i = start;
 4     int j = last;
 5     int temp = array[i];
 6     if (i < j)
 7     {
 8         while (i < j)
 9         {
10             //
11             while (i < j &&  array[j]>=temp )
12                 j--;
13             if (i < j)
14             {
15                 array[i] = array[j];
16                 i++;
17             }
18 
19             while (i < j && temp > array[i])
20                 i++;
21             if (i < j)
22             {
23                 array[j] = array[i];
24                 j--;
25             }
26                         
27         }
28         //把基準數放到i位置
29         array[i] = temp;
30         //遞歸方法
31         QuickSort(array, start, i - 1);
32         QuickSort(array, i + 1, last);
33     }
34 }

快速排序 用C++函數模板實現

 1 template<typename T>
 2 void quicksort(T data[], int first, int last)
 3 {
 4     int lower = first + 1;
 5     int upper = last;
 6     swap(data[first], data[(first + last) / 2]);
 7     T bound = data[first];
 8     while (lower <= upper)
 9     {
10         while (data[lower] < bound)
11             lower++;
12         while (data[upper] > bound)
13             upper--;
14         if (lower < upper)
15             swap(data[lower++], data[upper--]);
16         else lower++;
17     }
18     swap(data[upper], data[first]);
19     if (first < upper - 1)
20         quicksort(data, first, upper - 1);
21     if (upper + 1 < last)
22         quicksort(data, upper + 1, last);
23 }
24 
25 template<class T>
26 void quicksort(T data[], int n)
27 {
28     int i, max;
29     if (n < 2)
30         return;
31     for (i = 1, max = 0; i < n; i++)
32         if (data[max] < data[i])
33             max = i;
34     swap(data[n - 1], data[max]);
35     quicksort(data, 0, n - 2);  //  
36 }

快速排序 主函數測試代碼

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <time.h>
using namespace std;

void PrintArray(int array[], int len)
{
    for (int i = 0; i < len; i++)
    {
        cout << array[i] << " ";
    }
    cout << endl;
}

int main(void)
{
    const int NUM = 10;
    int array[NUM] = { 0 };
    srand((unsigned int)time(nullptr));
    for (int i = 0; i < NUM; i++)
    {
        array[i] = rand() % 100 + 1;
    }
    cout << "排序前:" << endl;
    PrintArray(array, NUM);
    cout << "排序後:" << endl;
    quicksort(array, 0, NUM - 1);
        PrintArray(array, NUM);

    return 0;
}    

快速排序(C++實現)