十大經典排序c

2021-10-10 07:27:18 字數 4757 閱讀 9990

插入排序

選擇排序

歸併查詢

非比較類排序

通過比較來決定元素間的相對次序。不需要額外分配空間。

思路1.第一層迴圈, n-1次迭代。 (兩個元素,只需對調一次,依次類推)

2.第二層迴圈, 兩兩比較(可以從左往右把最大值放到後面,也可以從右往左把最小值放到前面)

void

bubblesort

(vector<

int>

& arr)}}

}

空間複雜度= o(1)

時間複雜度

最差 = 最好= 平均 = o(n2)

最好到o(n) 需要優化**

void

bubblesort

(vector<

int>

& arr)}if

(!swaped)

break;}

}

思路:

用第乙個元素作為關鍵值,左右兩個索引值向中間靠攏知道兩個索引重疊,每次迴圈把輸組分為兩部分,小於等於關鍵值的元素在關鍵值的左側,其他的在右側。

void

quicksort

(vector<

int>

& arr,

int low,

int high)

arr[i]

= pivot;

quicksort

(arr, low, i -1)

;quicksort

(arr, i +

1, high);}

}

空間複雜度= o(1)

時間複雜度

最好 = o(nlog(n))

平均 = o(nlog(n))

最差 = o(n2) //當輸組逆序,則失去二分特性,變成冒泡

優化方式,產生隨機值,與第乙個元素替換

void

quicksort

(vector<

int>

& arr,

int low,

int high)

//int i = low;

int j = high;

int pivot = arr[low]

;while

(i < j)

arr[i]

= pivot;

quicksort

(arr, low, i -1)

;quicksort

(arr, i +

1, high);}

}

對於未排序資料,在已排序序列中從後向前掃描,找到相應位置並插入。

void

insertionsort

(vector<

int>

& arr)

arr[j]

= key;

}}

空間複雜度= o(1)

時間複雜度

最差=平均= o(n2)

最好= o(n) 對於已經排序好的陣列

思路:跳躍的插入排序

void

shellsort

(vector<

int>

& arr)

arr[j]

= key;}}

}

思路:

從左往右依次找出最小指,每次迴圈最後把最小值和外迴圈的index位置對調

void

selectsort

(vector<

int>

& arr)}if

(minindex != i)

}}

思路:

建大頂堆,則每個父節點都大於子節點。然後把父節點和倒數最後一位對調,陣列最後一位則為最大值,下次迴圈把陣列長度減少一,再堆排序第乙個節點,進入下個迴圈把第一位和倒數第二個元素對調,依次類推

void

heapify

(vector<

int>

& arr,

int i,

int length)

if(rchild < length && arr[rchild]

> arr[i])}

void

buildmaxheap

(vector<

int>

& arr)

}void

heapsort

(vector<

int>

& arr)

}

devide and conqure

void

merge

(vector<

int>

& arr,

int left,

int mid,

int right)

else

}while

(i <= mid)

while

(j <= right)

int k =0;

for(

int i = left; i <= right; i++)}

void

mergesort

(vector<

int>

& arr,

int left,

int right)

}

思路:

第乙個迴圈找出輸組裡最大最小值。

把最小值作為乙個基數,分配乙個臨時陣列/vector變數,長度 = 最大值- 最小值。

第二次迴圈把每個元素出現的次數累計到臨時陣列,temparr[0] 記錄的是最小值出現的次數,依次類推

最後便利臨時陣列重現把值放回原來的陣列。

void

countsort

(vector<

int>

& arr)

int min = int_max;

int max = int_min;

for(

int a:arr)

if(max < a)

} vector<

int>

temparr

(max - min +1)

;for

(int i =

0; i < len; i++

)int k =0;

for(

int i =

0; i < max - min +

1; i++)}

}

思路:

根據桶的大小(兩個桶之間的步長)和陣列最大最小值的差距算出桶個數

為每個桶建立乙個陣列或者容器

把原始陣列裡的值根據大小放到相應的桶裡。

對每個桶裡元素排序,用其他演算法

由於桶是有序的,只需把所有桶的元素放回原來陣列即可

適合陣列裡元素分配均勻,否則浪費空間。計數排序就是個特殊的桶排序,桶大小為1. 桶排序比計數排序好在於適用於double值。

void

bucketsort

(vector<

int>

& arr,

int bucketsize)

int min = int_max;

int max = int_min;

for(

int a : arr)

if(max < a)

}int nbuckets =

(max - min)

/ bucketsize +1;

vectorint>>

buckets

(nbuckets)

;for

(int a : arr)

for(

auto

& var: buckets)

//注意這裡要用引用

int k =0;

for(

auto var : buckets)

}}

思路:

按照數字的位數排,可以從低位到高位,也可從高位到低位,

每位排序需要分配從0到9十個桶,把相應位數的陣列元素放入後,按順序放回陣列,依次類推,每一位都排序過,這個陣列就排好序了。

也是個特殊的桶排序,每次十個桶。 這個排序適用於陣列元素型別是 unsigned int(0或者正整數)。不適用於double值。

void

radixsort

(vector<

int>

& arr)

}int digit =1;

while

(max /

10>0)

// sort

int dev =1;

for(

int i =

1; i <= digit; i++

, dev *=10

)int k =0;

for(

auto bucket:buckets)}}

}

十大經典排序

每一次比較完就要立即交換 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。比較完所有...

十大經典排序演算法

載自 排序演算法是 資料結構與演算法 中最基本的演算法之一。排序演算法可以分為內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序演算法有 插入排序 希爾排序 選擇排序 氣泡排序 歸併排序 快速排...

十大經典排序演算法

不穩定排序種類為4種 快速排序 核心思想是partition操作 二分法分而治之 平均時間複雜度nlogn 希爾排序 高階版的插入排序,先把間隔較遠的子串行排序,最後間隔為1時,等同於插入排序 插入排序在序列有序時,時間複雜度常數級,所以先讓子串行總體有序,能有效降低時間複雜度 平均時間複雜度n 1...