演算法
時間複雜度(平均)
時間複雜度(最壞)
時間複雜度(最好)
空間複雜度
穩定性氣泡排序
o(n^2)
o(n^2)
o(n)
o(1)
穩定選擇排序
o(n^2)
o(n^2)
o(n^2)
o(1)
不穩定插入排序
o(n^2)
o(n^2)
o(n)
o(1)
穩定希爾排序
o(nlogn)
o(n^2)
o(n)
o(1)
不穩定快速排序
o(nlogn)
o(n^2)
o(nlogn)
o(logn)
不穩定歸併排序
o(nlogn)
o(nlogn)
o(nlogn)
o(n)
穩定桶(基數)排序
o(n * r)
o(n * r)
o(n * r)
o(n * r)
穩定
每遍歷一次,將當前遍歷的所有元素的最大值置於最後。即第一次遍歷將陣列中所有元素的最大值置於倒數第一位,第二次遍歷(除開最後一位)剩餘所有的數,將其中的最大值置於倒數第二位。以此類推。。。
public
static
void
bubble
(int
arr)}if
(!flag)
}}
每遍歷一次,將當前遍歷的所有元素的最小值和首位進行交換。即第一次遍歷將陣列中所有元素的最小值和陣列第一位進行交換,第二次遍歷(除開第一位)剩餘所有的數,將其中的最小值和第二位進行交換。以此類推。。。
public
static
void
select
(int
arr)}if
(minindex != i)
}}
將陣列分為兩個部分,前半部分有序,依次遍歷後半部分,在有序部分中找到合適的位置插入
public
static
void
insert
(int
arr)
else
// }
//// insertindex++;
while
(insertindex >
0&& arr[insertindex -1]
> insertval)
if(insertindex != i)
}}
希爾排序是插入排序的一種優化,在簡單插入排序中,如果出現很小的數在陣列後端,需要後移的運算元量很多。為了減少這種移動,所以有了希爾演算法。希爾排序的核心思想是:
將陣列按照一定的增量分組,對每組進行簡單插入排序,逐漸減少增量至1,即對整個陣列進行一次簡單插入,得到最後的有序陣列。
public
static
void
shell
(int
arr)
if(insertindex != i)}}
}
快速排序是找到乙個基準數,將比基準數小的數全部放到左邊,將比基準數大的數全部放到右邊。然後依次遞迴排序左右子陣列。
public
static
void
quick
(int
arr,
int left,
int right)
//取中間的值為基準值
int pivotval = arr[
(left + right)/2
];//採用雙指標遍歷陣列
int i = left;
int j = right;
int temp =0;
while
(j > i)
while
(arr[j]
> pivotval)
if(i >= j)
if(i != j)
if(arr[i]
== pivotval)
if(arr[j]
== pivotval)}if
(i == j)
//遍歷左邊陣列
quick
(arr, left, j)
;//遍歷右邊陣列
quick
(arr, i, right)
;}
歸併排序是將陣列劃分為兩個部分,一直分解到每個陣列只有乙個數字。接著開始合併,每次將兩個子陣列合併為乙個有序的陣列.比如將【2,1,3,4】會被分解為、、、,接著將、合併為【1,2】,、合併為【3,4】,然後將【1,2】,【3,4】合併為【1,2,3,4】。
public
static
void
merge
(int
arr,
int left,
int right)
else
}//2.將另一邊剩餘的數字依次填充到臨時陣列中
while
(i <= mid)
while
(j <= right)
//3.將臨時陣列copy到原來的陣列中
tempindex =0;
i = left;
while
(tempindex < temp.length)
}}
桶排序(基數排序),將所有數字變成同樣的數字長度(即數字較短的數前面補零)例如【1,100】變為【001,100】從低位開始,依次進行一次排列,當最高位排完就得到了有序序列
說明:桶排序非常占用記憶體,如果排列的陣列過大,容易造成記憶體溢位,另外不支援負數的排序
public
static
void
bucket
(int
arr)
}int maxlength =
(max +"")
.length()
;//第一次遍歷數字的個位數,第二次是十位數,以此類推。。。
for(
int i =
0, n =
1; i < maxlength; i++
, n *=10)
//遍歷桶,將桶中的元素依次放回原陣列
int index =0;
for(
int j =
0; j < bucketelementscount.length; j++
) bucketelementscount[j]=0
;}}}
將陣列設計成大頂堆或者小頂堆,將堆頂位置的元素與陣列末端的元素交換得到有序陣列大頂堆原理:大頂堆要求父節點的值大於等於左子樹的值,又大於等於右子樹的值。
小頂堆原理:小頂堆要求父節點的值小於等於左子樹的值,又小於等於右子樹的值。
public
static
void
heap
(int
arr)
int temp =0;
for(
int j = arr.length -
1; j >
0; j--)}
private
static
void
adjustheap
(int
arr,
int i,
int length)
if(temp >= arr[maxindex]
) arr[i]
= arr[maxindex]
;//繼續調整當前節點的左子節點
i = maxindex;
lchildindex =
2* i +1;
rchildindex =
2* i +2;
} arr[i]
= temp;
}
資料結構與演算法 四 排序
def heap sort li def heapfly li start len li 2 1 獲取最後乙個葉子節點的父節點 for nod in range start,1,1 left 2 nod 1 right min left 1,len li 1 temp left if li left...
資料結構 2 排序演算法
常見的排序演算法 氣泡排序 選擇排序 插入排序 歸併排序 快速排序 堆排序 includeusing namespace std void swap int a,int i,int j 冒泡法 平均時間複雜度 o n 2 void bubblosort int a,int n void bubblo...
資料結構3 排序演算法
氣泡排序 演算法描述 排序問題是基本演算法,主要有冒泡演算法 插入排序以及選擇排序演算法。冒泡演算法是對整個列進行多次遍歷迴圈,直至將所有的數都比較一遍,每次迴圈都能產生乙個最大數放置於後面,這樣需要兩層迴圈 外層控制次數,內層控制單次冒泡,內層針對的是相鄰裡兩個進行比較的迴圈。using syst...