共鳴問題(牛客程式設計巔峰賽S2第12場 - 青銅&白銀&黃金 )
阿新 • • 發佈:2020-12-24
快速排序是採用了一種分治的策略,通常稱其為分治法。
該方法的基本思想是:
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;
}