原理論述:假如說現在有個陣列,我想對它進行公升序排序。選擇排序的思想是,將第乙個位置的元素和其後的元素逐個的進行比較,如果比第乙個位置的元素小,則進行交換,第一組迴圈結束時,第乙個位置存放了最小的數。然後用這樣的方式其後位置上的元素。
時間複雜度:n的平方級別 空間複雜度:n,不需要額外的儲存空間。
插入排序比選擇排序的思維有所改進。選擇排序是某個位置上的元素和它後面的元素進行比較,但是插入排序是某個位置上的元素和它前面的有序陣列進行比較。當該元素大於有序陣列的最後一位時,都沒有必要和更靠前的數進行比較了。也就是因為它這個特性,插入排序對於部分有序的陣列而言,演算法複雜度要比選擇排序低很多。但是對於完全隨機的陣列,演算法複雜的依然是n的平方級別。
時間複雜度:最壞n的平方 最好n 空間複雜度:n,不需要額外的儲存空間
它是插入演算法的改進版,改進後端演算法在處理隨機排序陣列時,效率也會得到提公升。思想:以長度n取截斷資料,假設陣列的長度是l,那麼截斷後就會產生l/n個子陣列,對這l/n個子陣列對應的位置進行插入排序,然後縮小n再進行上面的操作。反覆執行上面的操作,直到n=1為止。
時間複雜度:不確定
原理:不斷的迭代切割生成子陣列,子陣列中會有3個游標low,mid,high;需要比較的是low-mid,mid-high這兩個區間對應位置上的元素。注意:在比較前,演算法的設計是將資料拷貝到乙個副本上,比較的也是副本上的元素。簡單來說每次比較都會將較小的元素放入陣列中,讓後對應的游標加1。具體流程,記住下面的四個判斷:左邊用盡取右邊元素,右邊用盡取左邊元素,左半邊當前元素小於右半邊當前元素取左邊,反之取右邊。
上面接受的演算法的複雜度在最壞的情況下都是n的平方,但是歸併排序可以做到n*logn級別的複雜度,但是會犧牲空間。並歸排序每一次迭代都會建立乙個副本去存放資料,這對空間是非常浪費的。
時間複雜度:nlogn
空間複雜度:n
快速彌補了並歸排序的缺點,它的平均的時間複雜度是nlogn,空間複雜度方面,它對記憶體的消耗是常數級,基本可以不考慮。
最差的時間複雜度是n^2,最差的空間複雜度是n(但是概率非常小,可以忽略不計)。
原理:快速排序有兩個指標i,j 分別從陣列的頭部和尾部開始向中間移動。基數選擇,一般是會以陣列的第乙個元素作為基數。迴圈是從陣列的尾端開始的,如果j位置上的數大於基數則略過,如果位置上的數小於基數,則將j位置上的數放到i位置上,然後i向右移動一位,比較移動後位置上的元素和基數。如果小於則略過,如果大於者用i位置上的元素替換j位置上的元素。如此迴圈,直到ij重合。此時,基數將陣列一分為2,左邊的小於基數右邊的大於基數。然後再用上述方法處理兩個子陣列。
堆排序是基於二叉堆,構建起來的排序演算法。二叉堆有兩個特性:父元素必定大於字元素,葉子節點的層級不會超過1。
構建乙個二叉堆的複雜度:2n次比較。
從2叉堆中刪除掉最大元素後,採用下層演算法,來構建乙個新的二叉堆需要進行2logn次比較。
所以對於取最大的k個數的命題。採用堆排序的演算法的複雜度為:2klogn+2n。當k=n時,就是整個陣列的排序的複雜度:2nlogn+2n
排序演算法比較
本章中已經研究並仔細分析了多個內部排序方法。對於這些內部排序方法之間的比較,主要從以下幾個方面綜合考慮 時間複雜度 空間複雜度 演算法穩定性 演算法簡單性 待排序記錄數 n的大小 記錄本身的資訊量等。選擇n 個整數組成一些隨機排序,各種內部排序方法的實際時間如圖 7 10 所示。從時間複雜度看,所有...
排序演算法比較
排序方法 最好時間 平均時間 最壞時間 輔助儲存 穩定性備註 簡單選擇排序 o n2 o n2 o n2 o 1 不穩定n小時較好 直接插入排序 o n o n2 o n2 o 1 穩定大部分已有序時較好 氣泡排序 o n o n2 o n2 o 1 穩定n小時較好 希爾排序 o n o nlogn...
比較排序演算法
常用的比較排序演算法有 直接插入排序,希爾排序,選擇排序,堆排序,氣泡排序,快速排序,歸併排序等。它們的時間複雜度及空間複雜度為 實現 如下 includeusing namespace std include include 插入排序 void insertsort int a,size t si...