排序小結(二)

排序小結(二)
//並歸排序(穩定的排序算法,時間複雜度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需求的內存更多,速度也稍慢。
發佈了41 篇原創文章 · 獲贊 145 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章