1. 程式人生 > 其它 >No.1 排序 - 快速排序

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,即可實現”對學生以分數進行的排名”,太懶了,不寫了