001-快速排序(C++實現)

 快速排序的基本實現ios

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

一、從數列中取出一個數做爲基準數(樞軸,pivot)。 數組

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

三、再對左右的子區間重複第二步的劃分操做,直至每一個子區間只有一個元素。測試

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

快速排序時間複雜度spa

快速排序的時間複雜度在最壞狀況下是O(N2),平均的時間複雜度是O(N*lgN)code

這句話很好理解:假設被排序的數列中有N個數。遍歷一次的時間複雜度是O(N),須要遍歷多少次呢?至少lg(N+1)次,最多N次。
(01) 爲何最少是lg(N+1)次?快速排序是採用的分治法進行遍歷的,咱們將它看做一棵二叉樹,它須要遍歷的次數就是二叉樹的深度,而根據徹底二叉樹的定義,它的深度至少是lg(N+1)。blog

所以,快速排序的遍歷次數最少是lg(N+1)次。
(02) 爲何最可能是N次?這個應該很是簡單,仍是將快速排序看做一棵二叉樹,它的深度最大是N。所以,快讀排序的遍歷次數最可能是N次。排序

快速排序穩定性
快速排序是不穩定的算法,它不知足穩定算法的定義。
算法穩定性 -- 假設在數列中存在a[i]=a[j],若在排序以前,a[i]在a[j]前面;而且排序以後,a[i]仍然在a[j]前面。則這個排序算法是穩定的!

快速排序 實現一:

 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;
}    
相關文章
相關標籤/搜索