排序演算法總結 C 版)

2021-07-01 22:40:30 字數 4012 閱讀 9194

1:時間複雜度:分析關鍵字比較次數和記錄的移動次數;

2:空間複雜度:需要的輔助記憶體;

3:穩定性:相同的關鍵字計算後,次序是否不變。

直接插入排序

(insertionsort)

的基本思想是:

每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中的適當位置,直到全部記錄插入完成為止。例如

int a=new int

一般設陣列為

a[0…n-1]

。1.     

初始時,

a[0]自成1

個有序區,無序區為

a[1..n-1]

。令i=1

2.     

將a[i]

併入當前的有序區

a[0…i-1]

中形成a[0…i]

的有序區間。

3.     i++

並重複第二步直到

i==n-1

。排序完成。

先for

迴圈n-1

次,插入資料,,跟前面的乙個個比較。。

如果a[j]

前乙個資料

a[j-1] > a[j]

,就交換

a[j]

和a[j-1],再

j-- 

直到a[j-1]<= a[j

]。這樣也可以實現將乙個新資料新併入到有序區間。

//從小到大直接插入排序方法

public static void insertsort(seqlistseqlist)}}

}

思路:第一次從r[0]~r[n-1]中選取最小值,與r[0]交換,第二次從r~r[n-1]中選取最小值,與r[1]交換,...., 第i次從r[i-1]~r[n-1]中選取最小值,與r[i-1]交換,.....,第n-1次從r[n-2]~r[n-1]中選取最小值,與r[n-2]交換,總共通過n-1次,得到乙個按排序碼從小到大排列的有序序列。

1、設陣列

內存放了

n個待排數字,陣列下標從

1開始,到

n結束。

2、初始化

i=13

、從陣列的第i

個元素開始到第

n個元素,

尋找最小的元素。

4、將上一步

找到的最小元素和第

i位元素交換。5

、i++,

直到i=n-1

演算法結束,否則回到第3步

//從小到大簡單選擇排序方法

public static void ******selectsort(seqlistseqlist)

seqlist[low] = seqlist[high]; //將比tmp小的放在前面,low位置

while ((low < high) &&(seqlist[low] <= tmp)) //前面比tmp小的不動

seqlist [high ]=seqlist [low ]; //將比tmp大的放在後面,high位置

//知道此時 low=high

}seqlist[high] = seqlist[low] = tmp;//此時low=high ,就完成了以tmp值來分界

//分別對前後兩部分來 快速排序

if(i < low - 1) //對tmp前面的數(0到low-1)遞迴呼叫,,此時【low】==tmp,low=high

if(low + 1 < j) //對tmp後面的數(low+1到j)遞迴呼叫,,此時【low】==tmp,low=high

}

在程式設計相關領域,堆(heap)的概念主要涉及到兩個方面:

本文所說的堆,指的是前者。

堆排序演算法是基於完全二叉樹的排序演算法,把一顆完全二叉樹調整為堆,時間複雜度是o(nlgn)

,與快速排序達到相同的時間複雜度。但是

在實際應用中,我們往往採用快速排序而不是堆排序。

這是因為快速排序的乙個好的實現,往往比堆排序具有更好的表現。

堆排序的主要用途,是在形成和處理優先順序佇列方面

。另外,如果計算要求是類優先順序佇列(比如,只要返回最大或者最小元素,只有有限的插入要求等),堆同樣是很適合的資料結構。

二叉堆是完全二叉樹或者是近似完全二叉樹。

二叉堆滿足二個特性:

1.父結點的鍵值總是大於或等於(小於或等於)任何乙個子節點的鍵值。

2.每個結點的左子樹和右子樹都是乙個二叉堆(都是最大堆或最小堆)。

當父結點的鍵值總是大於或等於任何乙個子節點的鍵值時為最大堆。當父結點的鍵值總是小於或等於任何乙個子節點的鍵值時為最小堆。下圖展示乙個最小堆:

一般都用陣列來表示堆,i結點的父結點下標就為(i – 1) / 2。它的左右子結點下標分別為2 * i + 1和2 * i + 2。如第0個結點左右子結點下標分別為1和2。

堆排序演算法的

基本思想

是,將陣列a建立為乙個最大堆,然後交換堆的根(最大元素)和最後乙個葉節點x,將x從堆中去掉形成新的堆a1,然後重複以上動作,直到堆中只有乙個節點。

主要是二路歸併排序,基本思想是:

將兩個有序表合併為乙個有序表。(n個數為n個長度為1的表,合併為n/2個長度為2的表,以此類推,最終生成1個長度為n的表)

該演算法是採用

分治法(

divide and conquer  

將大化小,將複雜歸為簡單

)的乙個非常典型的應用。

分治法的精髓:(

是很多高效演算法的基礎,如

排序演算法

(快速排序

,歸併排序

),傅利葉變換(

快速傅利葉變換))

分--將問題分解為規模更小的子問題;

治--將這些規模更小的子問題逐個擊破;

合--將已解決的子問題合併,最終得出「母」問題的解;

歸併排序的效率是比較高的,設數列長為n,將數列分開成小數列一共要logn步,每步都是乙個合併有序數列的過程,時間複雜度可以記為o(n),故一共為

o(n*logn)。

因為歸併排序每次都是在相鄰的資料中進行操作,所以歸併排序在o(n*logn)的幾種排序方法(快速排序,歸併排序,希爾排序,堆排序)也是效率比較高的。也是

穩定的排序演算法。

與前面的排序演算法(通過關鍵碼的比較和移動來排序)完全不同,基數排序是一種借助於多關鍵碼排序的思想,是將單關鍵碼按基數分成多關鍵碼進行排序的方法,是一種分配排序。

基數排序只適合於字串和整數這種有明顯結構特徵的關鍵碼。

它是怎麼排序的呢?我們可以按照下面的一組數字做出說明:12、 104、 13、 7、 9

(1)按個位數排序是12、13、104、7、9

(2)再根據十位排序104、7、9、12、13

(3)再根據百位排序7、9、12、13、104

這裡注意,如果在某一位的數字相同,那麼排序結果要根據上一輪的陣列確定,舉個例子來說:07和09在十分位都是0,但是上一輪排序的時候09是排在07後面的;同樣舉乙個例子,12和13在十分位都是1,但是由於上一輪12是排在13前面,所以在十分位排序的時候,12也要排在13前面。

所以,一般來說,10基數排序的演算法應該是這樣的

(1)判斷資料在各位的大小,排列資料;

(2)根據1的結果,判斷資料在十分位的大小,排列資料。如果資料在這個位置的餘數相同,那麼資料之間的順序根據上一輪的排列順序確定;

(3)依次類推,繼續判斷資料在百分位、千分位......上面的資料重新排序,直到所有的資料在某一分位上資料都為0。

分治演算法排序(C 版)

分治排序 把乙個陣列分成兩個陣列,然後在把這兩個陣列再各自分成兩個陣列,直到陣列有兩個數,然後比較這兩個數,並且合併,排序。就是上面這個樣子 的。不說了上 c 版 name 分治演算法 time 15 8 9 14 25 environment ubuntu 14.04,sublime text 3...

排序演算法筆記(C 版)

記錄最近學習的一些排序演算法 注 第乙個演算法給出了完整的測試程式,其餘的為避免重複及節省空間,只顯示排序演算法部分 執行結果的程式耗時每次執行略有不同,僅供大致對比參考 時間複雜度 o n 最好 o n2 平均 o n2 最差 空間複雜度 o 1 include include 計時用 using...

C 版 常用排序演算法。

1 個人學習記錄。2 大佬請繞道。using system.collections using system.collections.generic using unityengine namespace datastructure.wcc region 穩定排序 歸併排序 氣泡排序 插入排序。re...