排序小結(二)
STL的sort基於快速排序,拋開處理器的影響不談,它是一種複雜度爲O(nlogn)的高效排序方法。
另外,sort還對快速排序的最壞情況添加了應對機制,克服了其在最壞情況下複雜度高達O(n²)的缺點
但要注意,sort屬於不穩定的排序算法
在需要穩定的排序算法時,我們可以選用以並歸排序爲基礎的stable_sort。
只不過stable_sort的複雜度雖然也O(nlogn),但比sort需求的內存更多,速度也稍慢。
//並歸排序(穩定的排序算法,時間複雜度O(nlogn))
#include<iostream>
using namespace std;
#define MAX 500000
#define SENTINEL 2000000000
int L[MAX / 2 + 2], R[MAX / 2 + 2];
int cnt;
void merge(int A[], int n, int left, int mid, int right) {
int n1 = mid - left;
int n2 = right - mid;
for (int i = 0; i < n1; i++)L[i] = A[left + i];
for (int i = 0; i < n2; i++)R[i] = A[mid + i];
L[n1] = R[n2] = SENTINEL;
int i = 0, j = 0;
for (int k = left; k < right; k++) {
cnt++;
if (L[i] <= R[i]) {
A[k] = L[i++];
}
else {
A[k] = R[j++];
}
}
}
void mergeSort(int A[],int n,int left,int right) {
if (left + 1 < right) {
int mid = (left + right) / 2;
mergeSort(A, n, left, mid);
mergeSort(A, n, mid, right);
merge(A, n, left, mid, right);
}
}
int main() {
int A[MAX], n, i;
cnt = 0;
cin >> n;
for (i = 0; i < n; i++)
cin >> A[i];
mergeSort(A, n, 0, n);
for (i = 0; i < n; i++) {
if (i) cout << " ";
cout << A[i];
}
cout << endl;
cout << cnt << endl;
return 0;
}
//分割問題(以數組最後一個元素爲中間數,將小於該數的放左邊,大於該數的放右邊)
//時間複雜度O(n)
#include<stdio.h>
#define MAX 100000
int A[MAX], n;
int partition(int p, int r) {
int x, i, j, t;
x = A[r];
i = p - 1;
for (j = p; j < r; j++) {
if (A[j] <= x) {
i++;
t = A[i]; A[i] = A[j]; A[j] = t;
}
}
t = A[i + 1]; A[i + 1] = A[r]; A[r] = t;
return i + 1;
}
int main()
{
int i, q;
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &A[i]);
q = partition(0, n - 1);
for (i = 0; i < n; i++)
{
if (i)
printf(" ");
if (i == 0)
printf("]");
printf("%d", A[i]);
if (i == q)
printf("]");
}
printf("\n");
return 0;
}
//計數排序(只要從輸入數組A的末尾元素開始選擇,計數排序就屬於穩定的排序算法。)
//平均時間複雜度O(n+k)
//以下代碼以數組A非負爲前提,其運行所需的時間及內存空間也與數組A中的最大值成正比
#include<stdio.h>
#include<stdlib.h>
#define MAX 2000001
#define VMAX 10000
int main() {
unsigned short *A, *B;
int C[VMAX + 1];
int n, i, j;
scanf("%d", &n);
A = (unsigned short *)malloc(sizeof(short)*n + 1);
B = (unsigned short *)malloc(sizeof(short)*n + 1);
for (i = 0; i <= VMAX; i++)
{
scanf("%hu", &A[i + 1]);//%hu代表以unsigned short格式輸出
C[A[i + 1]]++;
}
for (i = 1; i <= VMAX; i++)
C[i] = C[i] + C[i - 1];
for (j = 1; j <= n; j++) {
if (i > 1) printf(" ");
printf("%d", B[i]);
}
printf("\n");
return 0;
}
STL的sort基於快速排序,拋開處理器的影響不談,它是一種複雜度爲O(nlogn)的高效排序方法。
另外,sort還對快速排序的最壞情況添加了應對機制,克服了其在最壞情況下複雜度高達O(n²)的缺點
但要注意,sort屬於不穩定的排序算法
在需要穩定的排序算法時,我們可以選用以並歸排序爲基礎的stable_sort。
只不過stable_sort的複雜度雖然也O(nlogn),但比sort需求的內存更多,速度也稍慢。