插入排序
選擇排序
歸併查詢
非比較類排序
通過比較來決定元素間的相對次序。不需要額外分配空間。
思路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...