No.1 排序 - 快速排序
一、作為C++程式設計小白,有必要簡單分析、記錄下,快速排序演算法的實現,以便後續複習:
#include <stdio.h>
int a[101], n; //定義全域性變數,並在子函式中使用
void quicksort(int left, int right)
{
int i, j, t, temp;
if (left >= right)
return;
temp = a[left]; //temp中儲存基準數
i = left;
j = right;
while(i != j){ //其實應該是 i<j
//順序很重要,要先從右往左找
while(a[j] >= temp && i<j)
j--;
//再從左往右找
while(a[i] <= temp && i<j)
i++;
// i,j 找到陣列中對應資料時,交換位置
if (i<j){
t = a[i]; a[i]=a[j]; a[j]=t;
}
}
//當i=j,即 i/j 相遇時,將基準數歸位:left <-> i
a[left] = a[i];
a[i] = temp;
//遞迴
quicksort(left, i-1);
quicksort(i+1,right);
}
int main(){
int i,j,n;
scanf("%d",&n);
for (i=1; i<=n; i++){
scanf("%d",&a[i]);
}
quicksort(1,n);
for (i=1; i<=n; i++){
printf("%d ",a[i]);
}
return 0;
}
/* quicksort()
1.首先給定引數:列表的左右邊緣索引,畢竟你用的列表中那些位置,只有你自己知道;
2.如果 left>right,純屬開個玩笑;
3.如果left < right,對應 while(i!=j),這時候,a[left]為基準數,i,j還沒相遇,於是可以直接調換 a[i], a[j]
4.如果left = right,有兩種情況:都是為了讓基準數歸位
a.從right出發的 j 找到了比基準數小的值 a[j],然後 i 還沒找到比 temp 大的值就遇到了 j(i++ = j),不好意思了,把 a[i]==a[j]和基準數對調,使之歸位
b. j 還沒找到比基準數小的值 a[j](此時a[j] > temp),就遇到了 第三步中交換之後的 a[i] (j-- = i),那麼不好意思了,還是把a[i]和基準數對調,使之歸位(a[i]/a[j--] 比 temp 小)
5.基準數歸位以後呢,位置是 a[i],左邊是比它小的 (left, i-1),右邊是比它大的 (i+1, right),沒啥好說的,遞迴唄
*/
二、稍作修改,引入struct student,即可實現”對學生以分數進行的排名”,太懶了,不寫了