Python 獲取動漫番劇 -XXOO
阿新 • • 發佈:2021-01-28
快速排序C語言版(附帶視訊講解)
注:3種快排的名字是我自己取的,並非專業名稱
方法一(最常用的方法):左端抽軸(pivot)法
思路 && 操作:
- 排序準備:取左邊第一位數為pivot軸,即pivot = a[0],
再令left = a[0],right = a[N-1] - 排序過程:此時從右端(right)開始,比較right對應的數
與pivot軸的大小,如果右邊比pivot大(a[right] > pivot)
下標左移(right–),反之,將a[right]放在a[left]位置 - 完成一次操作(PartSort())迴圈結束條件為:left != right
- 遞迴函式進入條件:left < right
視訊講解:請點選->動畫
程式碼如下:
#include <stdio.h>
#define N 15
int PartSort(int * a, int left, int right);
void QuickSort(int * a, int left, int right);
void Print(int * a);
int main(void)
{
int i, a[N] = {5, 8, 1, 7, 4, 9, 48, 14, 0, 99, 45, 2, 84, 65, 6};
printf("Before sort:\n" );
Print(a);
printf("\nAfter sort:\n");
QuickSort(a, 0, N-1);
Print(a);
return 0;
}
int PartSort(int * a, int left, int right)
{
int pivot = a[left];
while (left != right)
{
while (left < right && a[right] >= pivot)
right --;
a[left] = a[right];
while (left < right && a[left] <= pivot)
left ++;
a[right] = a[left];
}
a[left] = pivot;
return left;
}
void QuickSort(int * a, int left, int right)
{
int mid = 0;
if (left < right)
{
mid = PartSort(a, left, right);
QuickSort(a, left, mid-1);
QuickSort(a, mid+1, right);
}
return;
}
void Print(int * a)
{
int i;
for (i = 0; i < N; i ++)
printf("%d ", a[i]);
printf("\n");
return;
}
執行結果如下:
方法二:右端基準(basic)法
思路 && 操作:
- 排序準備:選取最右端數字為basic(基準),最左端標記為L(left),
右端倒數第二個數標記為R(right) - 排序過程:從左端開始,L指向的數比basic所指數小,則L向後移動一位(left++)
否則則停下;後,右端開始出發,如果R所指向的數字比basic大,則R向前移動
一位(right–),直到R也停下,此時將二者對應的數字進行交換,L後移,R前移
各一位完畢後,再從左端開始重複以上操作 - 完成一次操作(PartSort())迴圈結束條件為 :left < rigt(而非left != rigt)
因為數字交換導致的L和R分別進位可能會導致二者"擦肩而過",永世不得相遇 - 遞迴函式進入條件為:left < right 程式碼如下
視訊講解:請點選->動畫
注:該視訊所講述略有瑕疵,視訊中說L(left)與R(right)相遇後,L與R所指的同一個數(a)要與basic基準交換。實際上,交不交換取決於該數(a)與basic的大小,如果該數(a)大於basic基準,肯定要作交換,但是反之,就不能直接交換了,需要用該數(a)的下一個數與basic交換,想想為什麼
舉個例子:3 2 1 5(basic) —進行操作— 3 2 1 5(basic)
L R ----doing… — L&R
這個時候1 就不能和 5 換位置,換了就變成 3 2 5 1,1比5小怎麼在5右側?
實際上:每一次的basic的軸都是將一組數分割成兩組的中心軸!
程式碼如下:
#include <stdio.h>
#define N 15
void Swap(int * a, int left, int basic);
int PartSort(int * a, int left, int right);
void QuickSort(int * a, int left, int right);
void Print(int * a);
int main(void)
{
int a[N] = {5, 8, 1, 7, 4, 9, 48, 14, 0, 99, 45, 2, 84, 65, 6};
printf("Before sort:\n");
Print(a);
QuickSort(a, 0, N-1);
printf("\nAfter sort:\n");
Print(a);
return 0;
}
void Swap(int * a, int left, int param)
{
int temp;
temp = a[left];
a[left] = a[param];
a[param] = temp;
return;
}
int PartSort(int * a, int left, int right)
{
int basic = right --;
while (left < right)
{
while (left < right && a[left] <= a[basic])
left ++;
while (left < right && a[right] >= a[basic])
right --;
if (left != right)
{
Swap(a, left, right);
left ++;
right --;
}
}
if (a[left] > a[basic]) Swap(a, left, basic);
else Swap(a, ++ left, basic);
return left;
}
void QuickSort(int * a, int left, int right)
{
int mid = 0;
if (left < right)
{
mid = PartSort(a, left, right);
QuickSort(a, left, mid-1);
QuickSort(a, mid+1, right);
}
return;
}
void Print(int * a)
{
int i;
for (i = 0; i < N; i ++)
printf("%d ", a[i]);
printf("\n");
return;
}
執行結果如下:
方法三:快慢指標(i,j)法
思路 && 操作:
- 排序準備:快慢指標的構建,i為慢指標,j為快指標;取最右端為pivot軸
指標初始位置為: j為最左端,i為j的前一位(沒錯,剛開始i不對應數字) - 排序過程:如果快指標j對應的數字比pivot小,則慢指標i前進1位, 然後將
快慢指標對應的值進行交換;如果快指標j對應的數字比pivot大,則慢指標i
不動最後,將慢指標右1位的數字(即i+1)對應的數字與pivot軸進行交換 - 完成一次操作(PartSort())迴圈結束條件為:快指標小於pivot軸位置(即j < pivot)
- 遞迴函式進入條件:start < end
視訊講解:請點選->視訊
程式碼如下:
#include <stdio.h>
#define N 15
void QuickSort(int * a, int start, int end);
int PartSort(int * a, int start, int end);
void Swap(int * a, int i, int j);
void Print(int * a);
int main(void)
{
int a[N] = {5, 8, 1, 7, 4, 9, 48, 14, 0, 99, 45, 2, 84, 65, 6};
printf("Before sort:\n");
Print(a);
QuickSort(a, 0, N-1);
printf("\nAfter sort:\n");
Print(a);
return 0;
}
void QuickSort(int * a, int start, int end)
{
int mid = 0;
if (start < end)
{
mid = PartSort(a, start, end);
QuickSort(a, start, mid-1);
QuickSort(a, mid+1, end);
}
return;
}
int PartSort(int * a, int start, int end)
{
int i = start - 1;
int j = start, pivot = end;
for (; j < end; j ++)
{
if (a[j] < a[pivot])
{
i ++;
Swap(a, i, j);
}
}
Swap(a, i + 1, pivot);
pivot = i + 1;
return pivot;
}
void Swap(int * a, int i, int j)
{
int temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
return;
}
void Print(int * a)
{
int i;
for (i = 0; i < N; i ++)
printf("%d ", a[i]);
printf("\n");
return;
}
執行結果如下:
以上就是與大家分享的全部內容啦,如果覺得對你有幫助,不妨點贊、收藏哦,當然如果有什麼謬誤,還請大家不吝賜教!謝謝觀看!