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...