資料結構與演算法(九)排序

2021-10-21 19:30:34 字數 4342 閱讀 9701

演算法

時間複雜度(平均)

時間複雜度(最壞)

時間複雜度(最好)

空間複雜度

穩定性氣泡排序

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