資料結構系列 一 排序演算法

2021-10-10 21:42:24 字數 4069 閱讀 9783

1.2 插入排序

1.3 選擇排序

1.4 歸併排序

1.5 堆排序

1.6 快速排序

基於資料狀況的排序演算法

1.7桶排序

1.8 小結

穩定排序:相對次序並沒有改變

void

bubblesortv1

(int a,

int n)

}}

實現:增加乙個sorted標誌,對於有序陣列則不再進行比較判斷。

複雜度分析:若序列本身有序,則遍歷一次即可。複雜度為o(n)

void

bubblesortv2

(int a,

int n)}}

}

void

bubblesortv3

(int a,

int n)}if

(sorted)

break;}

}

class

insertsort

arr[j+1]

= key;

//否則 j + 1 位置即為key的位置}}

};

時間複雜度:o(n

2)

o(n^2)

o(n2)

空間複雜度:o(1

)o(1)

o(1)

class

selectionsort

}swap

(arr[min_idx]

, arr[i]);

}}}

時間複雜度:o(n

2)

o(n^2)

o(n2)

空間複雜度:o(1

)o(1)

o(1)

step1: 對 [low, mid] 排序

step2: 對[mid + 1, high] 排序

step3: 合併

class

solution

return

process

(arr,

0, length-1)

;}private

:void

process

(int arr,

int low,

int high)

int mid = low +

((high - low)

>>1)

;process

(arr, low, mid)

;process

(arr, mid+

1, high)

;merge

(arr, low, mid, high);}

void

merge

(int arr,

int low,

int mid,

int high)

while

(p1 <= mid)

while

(p2 <= high)

for(i =

0; i < high-low+

1; i++)}

}

應用:

小和問題:右側有幾個比該數大

逆序對問題:左側有解比該數大

class

solution

int heapsize = length;

swap

(arr[0]

, arr[

--heapsize]);

while

(length >0)

}private

:void

heapinsert

(int arr,

int index)

}void

heapify

(int arr,

int index,

int heapsize)

swap

(arr[index]

, arr[largest]);

index = largest;

lest =

2* index +1;

}}}

堆排序的應用

場景:

如何從100萬個數中找出最大的前100個數

演算法分析:

先取出前100個數,維護乙個100個數的最小堆,遍歷一遍剩餘的元素,在此過程中維護堆就可以了。

隨機快速排序:主元隨機選擇。

class

quicksort

private

:void

partition

(int arr,

int low,

int high)

int randidx =

rand()

%(high - low +1)

;swap

(arr[high]

, arr[randidx]);

int less = low -1;

int more = high;

int index = low;

while

(index < more)

else

if(arr[index]

== arr[high]

)else

}swap

(arr[high]

, arr[more]);

partition

(arr, low, less)

;partition

(arr,

++more, high);}

};

應用:

荷蘭國旗問題

基於資料狀況的排序演算法,桶排序,包括計數排序與基數排序。當資料區間較小,資料範圍小時,可以使用計數排序。當資料為十進位制數時,可以通過基數排序進行排序。

限制:要求資料必須為十進位制數

時間複雜度:

空間複雜度:

限制:區間範圍足夠小

時間複雜度:

空間複雜度:

排序演算法

時間複雜度

額外空間複雜度

穩定性選擇排序

o (n

2)

o(n^2)

o(n2)o(1

)o(1)

o(1)

✖️氣泡排序

o (n

2)

o(n^2)

o(n2)o(1

)o(1)

o(1)

✔️插入排序

o (n

2)

o(n^2)

o(n2)o(1

)o(1)

o(1)

✔️歸併排序

o (n

logn

)o(nlogn)

o(nlog

n)o (n

)o(n)

o(n)

✔️堆排序

o (n

logn

)o(nlogn)

o(nlog

n)o (1

)o(1)

o(1)

✖️快速排序

o (n

logn

)o(nlogn)

o(nlog

n)o (l

ogn)

o(logn)

o(logn

)✖️桶排序o(n

)o(n)

o(n)

o (n

)o(n)

o(n)

✔️

資料結構《一》 排序演算法之氣泡排序

氣泡排序可以說是最簡單,大多數人最先接觸的排序演算法。臨近的數字兩兩進行比較,按照規定的順序進行交換,這樣一趟過去後,最大或最小的數字就像氣泡一樣被 排 最後一位,然後第二趟之後,次大或次小的數字被 排 到倒數第二位,以此類推,直至第一位與第二位順序正確。實現過程如圖 氣泡排序複雜度為o n 過程如...

資料結構《一》 排序演算法之選擇排序

選擇排序演算法描述 假設有一陣列,內有n個無序數字,進行從小到 擇排序,從第乙個數字開始遍歷陣列,挑選最小的數字與陣列第乙個數字進行交換,然後從第二個數字開始進行第二次遍歷,選次小的數字與第二個數字進行交換,以此類推,第n 1遍遍歷後,陣列排序完成。選擇排序實現過程 時間複雜度為o n 實現過程如下...

資料結構與演算法複習 一 排序演算法

這篇文章將會介紹常見的排序演算法 使用 c 實現 將陣列分為有序區 左邊 和無序區 右邊 在初始化時有序區為空,無序區包含陣列所有元素 每次從無序區的最後乙個元素開始,一直向前冒泡到無序區的第乙個位置,使其變成有序 templatevoid swap e a,int i,int j template...