排序
默認採用降序排列
1.冒泡排序
每次把最小的元素像泡泡一樣,放到數組末尾。
基本原理:外層循環次數有字符串長度-1決定。內層循環,後一個如果比自己小,就交換位置,第一輪就把最小的放到了最後一個元素位置上。那麼下一次循環只需要把第二小的放到倒數第二個位置上,所以內層循環次數隨外層循環變量一樣變化。
優化原理:在內層設置一個檢測是否發生數據交換的標緻變量,如果某一次循環沒有元素交換髮生,那麼說明剩餘數據已經有序。則直接跳出循環。
void bubble_sort(T arr[], int len)
{
int i, j; T temp;
for (i = 0; i < len - 1; i++)
for (j = 0; j < len - 1 - i; j++)
if (arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
---------------------
作者:關耳_12X
來源:CSDN
原文:https://blog.csdn.net/sunshine_12x/article/details/80987227
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!
end
2.選擇排序
循環更新最小值的下標,並記錄下來。最後將這個最小值和第一個元素交換。下一次從第二個元素開始循環,選出的自然是次小值。
基本原理:外層循環決定了選出的是第i小的值,min記錄下最小值的小標,每層循環結束後,將第i個元素和第min個元素交換位置。
public static void sort(int[] a){
int N=a.length;
for(int i=0;i<N;i++){
int min=i;
for(int j=i+1;j<N;j++){
if(a[j]<a[min]){
min=j;
}
}
int temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
---------------------
作者:cuit_cuit_cuit
來源:CSDN
原文:https://blog.csdn.net/cuit_cuit_cuit/article/details/80552641
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!
end
3.插入排序
從第二個元素開始循環,現將第二個元素保存在V中,1-2中循環,如果第一個元素比第二個元素大,就把第一個元素賦值給第二個元素,退出第二層循環後,在把v賦值給最後移動的那個元素。
原理:從第1個元素開始,只要比外層循環的值大的數都往後移一位,並記下break的J,將值插入到A[j]
5 4 3 2 1
for1: i= 1;j=i=1;v = a[1]
for2:a[j-1] > v ; a[j] = a[j-1];//5 5 3 2 1
j-- =0//break;
a[j] = v;//4 5 3 2 1 //j =1
for1: i= 2;j=i=2;v = a[2]
for2:a[j-1] > v ; a[j] = a[j-1];//4 5 5 2 1
j--;//j=1
a[j-1] > v ; a[j] = a[j-1];//4 4 5 2 1
j--;//j=0
a[j] = v;//3 4 5 2 1
void Insertion_Sort(int a[],int n)
{
int i,j;
for(i=1;i<n;i++)
{
int temp=a[i];
for(j=i;j>0&&a[j-1]>temp;--j)
a[j]=a[j-1];
a[j]=temp;
}
}
---------------------
作者:L_Aster
來源:CSDN
原文:https://blog.csdn.net/gl486546/article/details/53052933
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!
end
4.希爾排序
略
5.快速排序
原理:分區交換排序,分而治之。選擇數組最左邊的元素將數組分成兩個部分,一部分大於樞軸,一部小於樞軸,再對這個兩個數組遞歸調用算法。
template<class T>
void Print(T* arr, size_t n)
{
for (int i = 0; i < n; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
template<class T>
int PartSort(T* arr, int left, int right)
{
int key = arr[right];
while (left < right)
{
while (left < right && arr[left] <= key)
{
++left;
}
swap(arr[left], arr[right]);
while (left < right && arr[right] > key)
{
--right;
}
if (arr[left] != arr[right])
{
swap(arr[left], arr[right]);
}
}
//arr[left] = key;
return left;
}
void QuickSort(int* arr, int left, int right)
{
assert(arr);
if (left < right)
{
int div = PartSort(arr, left, right);
QuickSort(arr, left, div - 1);
QuickSort(arr, div + 1, right);
}
}
---------------------
作者:double_happiness
來源:CSDN
原文:https://blog.csdn.net/double_happiness/article/details/72303309
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!
這個寫法,實質每次都是左右兩邊分別和key交換。最後key在中間位置。
6.歸併排序
分而治之p
7.樹排序
將數據一個一個的添加到樹種,使用第一個元素作爲根節點,如果之後的元素比第一個小,則放到左子樹,否則放到右子樹,之後按中序遍歷。就會按照升序輸出啦。
8.計數排序
前提條件,輸入的數據在一個範圍內。
根據數據粒度,建立一個數組或者<key,value>.每個key的value決定最後排序此key的個數。
9.桶排序
桶排序跟基數排序相當。桶排序假設待排序的一組數均勻獨立的分佈在一個範圍中,並將這一範圍劃分成幾個子範圍(桶)。
然後基於某種映射函數f ,將待排序列的關鍵字 k 映射到第i個桶中 ,那麼該關鍵字k 就作爲 B[i]中的元素 (每個桶B[i]都是一組大小爲N/M 的序列 )。
接着將各個桶中的數據有序的合併起來 : 對每個桶B[i] 中的所有元素進行比較排序 (可以使用快排)。然後依次枚舉輸出 B[0]….B[M] 中的全部內容即是一個有序序列。
10.基數排序
略;
查找
二分查找
https://blog.csdn.net/qq78442761/article/details/73012452
散列
https://blog.csdn.net/duan19920101/article/details/51579136 拉鍊法
負載因子討論
https://bbs.csdn.net/topics/350237871