1. 程式人生 > 實用技巧 >共鳴問題(牛客程式設計巔峰賽S2第12場 - 青銅&白銀&黃金 )

共鳴問題(牛客程式設計巔峰賽S2第12場 - 青銅&白銀&黃金 )

技術標籤:c++快速排序演算法

快速排序是採用了一種分治的策略,通常稱其為分治法。
該方法的基本思想是:
1.先從數列中取出一個數作為基準數。
2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
3.再對左右區間重複第二步,直到各區間只有一個數。
雖然快速排序稱為分治法,但分治法這三個字顯然無法很好的概括快速排序的全部步驟。因此我的對快速排序作了進一步的說明:挖坑填數+分治法:
以一個數組作為示例,取區間第一個數為基準數。
在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述

void Swap(int *n, int *m){
	int temp;
	temp = *n;
	*n = *m;
	*m =
temp; } int partion(int a[], int left, int right){ int i, j, t, temp; temp = a[left]; //temp中存的就是基準數 i = left; j = right + 1; while (true) { while (a[++i] < temp&&i < right);//在左邊找大於temp的數 while (a[--j]>temp);//在右邊找小於temp的數 if (i >= j)//結束標誌 break; Swap(&a[i], &
a[j]); } a[left] = a[j]; a[j] = temp; return j; } void quicksort(int a[], int left, int right) { if (left <right) { int q = partion(a, left, right); quicksort(a, left, q - 1);//繼續處理左邊的,這裡是一個遞迴的過程 quicksort(a, q + 1, right);//繼續處理右邊的 ,這裡是一個遞迴的過程 } } int _tmain(int argc, _TCHAR* argv[])
{ srand((unsigned int)time(NULL)); int a[100]; int i, n; //讀入資料 scanf_s("%d", &n); for (i = 0; i < n; i++) //scanf_s("%d", &a[i]); a[i] = rand()%100; quicksort(a, 0, n - 1); //快速排序呼叫 //輸出排序後的結果 for (i = 0; i < n; i++) printf("%d ", a[i]); system("pause"); return 0; }