新手對快速排序的理解
阿新 • • 發佈:2020-12-02
此文轉載自:https://blog.csdn.net/m0_52699073/article/details/110357323
新手對於快速排序的理解
——————————————————————————————
小菜雞來分享此次所學了,我會盡可能講詳細點,畢竟我也是個菜鳥。
快速排序
快速排序顧名思義很快速,相比於氣泡排序與桶排序,快速排序結合了兩者的優點。快速又節省記憶體。下面我就向大家講解一下。
先舉個栗子:6 1 2 7 9 3 4 5 10 8
首先我們將第一個數6作為基準數(其實就是一個參照數)然後我們要將下面的數進行分類了,我們將比6小的數放在6的右邊比6大的數放在左邊。如下所示。 3 1 2 5 4 6 9 7 10 8(從右向左依次排序,這裡3與6的位置交換)這個時候我們再分別對左邊與右邊實行上面的同樣的程式直到最後的基準數兩邊都不需要交換了(這裡需要用到函式)。但是這只是我們的思路。
面對一組數字我們要用到陣列,這個時候我們不能一開是就將6放在中間而是先交換再將第一個數6與中間的數交換位置(偶數也是沒問題的);
具體的第一次排序過程如下:
6 1 2 7 9 3 4 5 10 8
6 1 2 5 9 3 4 7 10 8
6 1 2 5 4 3 9 7 10 8
3 1 2 5 4 6 9 7 10 8 後面就是對6的兩邊重複上述操作。自己一定要想一想哦。我就奉上我的程式碼了。
#include <stdio.h>
int a[100];//定義全域性變數 有因為兩個子函式都要用
void quicksort(int left,int right)
{
int i,t,j,first;
first=a[left];
i=left;
j=right;
while(i!=j)//兩邊的下標不相同是可以進行迴圈,相當於從搜尋到了中間
{
while(a[j]>=a[left] && i<j)//先從右向左尋找
j--;
while(a[i]<=a[left] && i<j)//從左向右尋找
i++ ;
if(i<j)//進行交換
{
t=a[j];
a[j]=a[i];
a[i]=t;
}
}
a[left]=a[i];
a[i]=first;//基準數的位置交換
quicksort(left,i-1);//左邊交換一輪後 左邊要長度要‘-1’因為基準數站了一個位子
quicksort(i+1,right);//右邊進行操作
}
int main()
{
int i,n;
printf("請輸入陣列的長度\n");
scanf("%d",&n);
printf("請輸入要排序的數字\n");
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
quicksort(1,n);
for(i=1;i<=n;++i)
{
printf("%d",a[i]);
}
getchar();getchar();//這裡相當於system("pause");
return 0;
}
這裡所用到的知識有 函式、for迴圈、字元交換、陣列、陣列下標的理解、以及對該程式流程的理解。有什麼不懂的歡迎提出問題。也歡迎給我提出建議。謝謝!