第3節 時間和空間的均衡 快速排序

2021-08-20 03:09:41 字數 1836 閱讀 7384

第一節講的計數排序有很好的執行時間表現,但因為占用空間的問題,只適用於數字非常有限的情況;

第二節講的氣泡排序解決了計數排序空間的問題,但時間複雜度卻變成了o(n^2)。

對氣泡排序的過程進行分析,我們可以發現,在每一輪的排序過程中,需要對所有相鄰的數字進行比較(當然,除了最後幾個最大數字),有的數字第一輪比較過了,第二輪可能還要比較,這就存在了優化的空間。

針對這個重複比較的問題,快速排序提出了基準數,減小比較次數,實現了演算法的優化。

快速排序的過程:

1、選擇乙個數作為基準數,也就是比較的標準

2、比這個數字小的放左邊,大的放右邊

3、再對左右區間重複第二步,直到各區間只有乙個數

這種重複左右區間直至乙個終止條件的方式,就是分治或者遞迴的過程,所以快速排序演算法也叫做分治演算法,可以簡單理解為分為左右兩部分,分別求解。

分治和遞迴的聯絡和區別,之後會在《演算法思想》中說明,這裡可以簡單理解為遞迴是實現分治的方法。

下面乙個動態表現了快速排序的過程

快速排序的過程也是乙個分治或者遞迴的過程,因為需要遞迴,即函式呼叫自身,只是引數不一樣,所以需要單獨寫乙個函式。

- 遞迴函式內部首先就要設定終止條件,具體到快速排序,就是最終只剩下乙個數,自然就排序完成了,就不用再遞迴了;

核心**如下,使用c語言:

//快速排序

void quicksort(int left, int right)

}//將基準數歸位

a[(left + right) / 2] = a[i];

a[i] = temp;

//左邊遞迴過程

quicksort(left, i - 1);

//右邊遞迴過程

quicksort(i + 1, right);

}

這裡是完整**,使用c語言

//輸入:6 5 3 1 8 7 2 4

//輸出:1 2 3 4 5 6 7 8

#include

using

namespace

std;

int a[100001];

//快速排序

void quicksort(int left, int right)

}//將基準數的位置放在大小分割的中間

a[(left + right) / 2] = a[i];

a[i] = temp;

//左邊遞迴過程

quicksort(left, i - 1);

//右邊遞迴過程

quicksort(i + 1, right);

}int main()

至此,計數排序、氣泡排序、快速排序的就全部完成了,你學會了嗎?具體掌握還需要加強練習,下一節,我們通過習題,鞏固學習!

快速排序的時間複雜度與空間複雜度

我理解的是,快速排序用的是分治法,運用的遞迴的演算法,先挑選乙個基準值,小於基準值的數放在左邊,大於基準值的數放在基準值的右邊,這樣就涇渭分明的三塊 但是這三塊是有序的,基準值左邊右邊的內 部數是無序的,所以,將基準值左右兩端繼續進行快速排序,直到區間長度為1,排序就完成了。下面使用vs2013實現...

快速排序(3)的應用 選擇 用於選出第K小的元素

本文描述了乙個快速排序的應用,用快速排序快速的選出資料中第k小的檔案 元素 乙個與排序有關但又不需要完全排序的應用是找出一組數的中間數的操作。尋找中間元素時選擇操作的乙個特例,即選擇一組數中的第 k 個最小元素。一種方法是對資料進行排序,但我們可以使用快速排序的劃分過程做的更好。選擇函式 選出第k小...

排序演算法的 時間複雜度 和 空間複雜度

常用的排序演算法的時間複雜度和空間複雜度 排序法 最差時間分析 平均時間複雜度 穩定度 空間複雜度 氣泡排序 o n2 o n2 穩定 o 1 快速排序 o n2 o n log2n 不穩定 o log2n o n 選擇排序 o n2 o n2 穩定 o 1 二叉樹排序 o n2 o n log2n...