目錄
1.交換排序
(1)冒泡排序
(2)快速排序
1.交換排序
基本思想:所謂交換,就是根據序列中兩個記錄鍵值的比較結果來對換這兩個記錄在序列中的位置,交換排序的特點是:將鍵值較大的記錄向序列的尾部移動,鍵值較小的記錄向序列的前部移動。
(1)冒泡排序
冒泡排序的特性總結:????????1. 冒泡排序是一種非常容易理解的排序????????2. 時間復雜度: O(N^2)????????3. 空間復雜度: O(1)????????4. 穩定性:穩定
冒泡的主要思想是 一趟一趟將最大、次大等等數據排放到最后的位置:
如:(單趟)
for (int i = 1; i < n; i++){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);}}
放完最大的數據到達數組最后一個位置后,就可以屏蔽最后一個位置(end下標)。
即n--;
完整冒泡:
// 冒泡排序
void BubbleSort(int* a, int n)
{for (int j = 0; j < n; j++){int flag = 1;for (int i = 1; i < n - j; i++){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);flag = 0;}}if (flag)break;}
}
加flag標注的原因僅是防止有序時遍歷n^2;
(2)快速排序
快速排序是 Hoare 于 1962 年提出的一種二叉樹結構的交換排序方法,其基本思想為: 任取待排序元素序列中 的某元素作為基準值,按照該排序碼將待排序集合分割成兩子序列,左子序列中所有元素均小于基準值,右 子序列中所有元素均大于基準值,然后最左右子序列重復該過程,直到所有元素都排列在相應位置上為止 。
與二叉樹的思想大致類似,熟悉二叉樹的遍歷遞歸后,這塊部分理解起來就會相對容易(本人感覺還是有點難度)。
核心思想:
while (l < r){while (l < r && a[r] >= a[keyi]){r--;}while (l < r && a[l] <= a[keyi]){l++;}Swap(&a[l], &a[r]);}
之后,可以將keyi移到中間位置,這時左邊全是比他小的數(可相等),右邊全是比他大的數(可相等),因此,就可以開始遞歸左邊和右邊,然后左邊的左邊和右邊等等,當begin >= end時,就可以return了。
完整代碼:
//快速排序
void QuickSort(int* a, int begin,int end)
{if (begin >= end)return;int keyi = begin;int l = begin;int r = end;while (l < r){while (l < r && a[r] >= a[keyi]){r--;}while (l < r && a[l] <= a[keyi]){l++;}Swap(&a[l], &a[r]);}Swap(&a[l], &a[keyi]);keyi = l; QuickSort(a, begin, keyi - 1);QuickSort(a, keyi + 1, end);
}
對代碼進行優化,可以取最左、中、最右三個值取中間大小的值最為基準值keyi,可以提高排序的效率。
即:
int GetMidi(int* a, int begin, int end)
{int midi = (begin + end) / 2;// begin end midi三個數選中位數if (a[begin] < a[midi]){if (a[midi] < a[end])return midi;else if (a[begin] > a[end])return begin;elsereturn end;}else// a[begin] >= a[midi]{if (a[midi] > a[end])return midi;else if (a[begin] < a[end])return begin;elsereturn end;}
}
//快速排序
void QuickSort(int* a, int begin,int end)
{if (begin >= end)return;int midi = GetMidi(a, begin, end);Swap(&a[midi], &a[begin]);int keyi = begin;int l = begin;int r = end;while (l < r){while (l < r && a[r] >= a[keyi]){r--;}while (l < r && a[l] <= a[keyi]){l++;}Swap(&a[l], &a[r]);}Swap(&a[l], &a[keyi]);keyi = l; QuickSort(a, begin, keyi - 1);QuickSort(a, keyi + 1, end);
}