(個人總結,如有遺漏或錯誤之處,請予以指正,謝)
快排,可以理解為一種類似分而治之的思路,當然最主要的是遞歸的思想。所謂遞歸,這里就不做具體介紹了。說的直接明了,就是函數體,自己調用自己。不過最重要的一點,也是自己曾經犯過的錯誤,一定不要忘了加入遞歸出口,否則會進去死循環。直接就沒有輸出了。
那么接下來,我們先來熟悉一下快排的思路。就是以數組中的某一個元素為標准,將大於它的元素全部移到右邊,小於它的全部移到左邊。這樣就完成了第一步。剩下的就是對第一部完成后的結果左邊的一部分再次進行同樣的處理。右邊的也進行同樣的處理。等到最后分離后的每一段長度都為1時則說明全部處理完成。可能大家對這個過程還有點小小的懵懵懂懂。自己試着去敲幾次就差不多熟悉了。
下面我們看代碼。
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
void Quickly_Sort(int *a, int l); //聲明排序函數,形參包括一個數組,一個數組長度
int main()
{
int i;
int N;//n用於存儲數組長度;
printf("請輸入數組長度\n");
scanf("%d",&N);
int *n=(int *)malloc(N*sizeof(int));//為數組申請內存
for (i = 0; i < N; i++) //循環輸入數組。
scanf("%d", &n[i]);
Quickly_Sort(n, N);
for (i = 0; i < N; i++)
printf(" %d ,", n[i]);
printf("\n");
}
void Quickly_Sort(int a[], int l)
{
int Criterion = *a; //以第一個數為標准,進行第一次遞歸。
int i = 0, j = l - 1, cnt = 0; //初始化變量,cnt用於記錄標准數的位置。
while (i != j)
{
for (; j > i; j--) //循環自左往右尋找比標准量小的交換
{
if (*(a + j) < Criterion) //找到進行交換,並跳出。
{
*(a + cnt) = *(a + j);
*(a + j) = Criterion;
cnt = j;
break;
}
}
for (; i < j; i++) //循環自左往右尋找比標准量小的交換
{
if (*(a + i) > Criterion) //找到進行交換,並跳出。
{
*(a + cnt) = *(a + i);
*(a + i) = Criterion;
cnt = i;
break;
}
}
}
if (i != 0) //安排遞歸條件,遞歸出口。
{
Quickly_Sort(a, i);
}
if (l - j - 1 != 0)
{
Quickly_Sort(a + i + 1, l - j - 1);
}
}
這里以長度為6進行測試。下面看測試輸出。
上面為輸入數據
下面為輸出結果。
OK,
(馬上就放假了,后面時間就會比較充裕,為大家更新算法,當然自己也是現學現賣,大家共同進步。)