版權聲明:轉載需標明該文鏈接。 https://blog.csdn.net/zaibeijixing/article/details/90035587
快速排序算法目前來說是性能高內存少的排序算法了。
- 原理是:依次拿基準值(可取起始值)比較尾、首,目標是將一段數字以基準值分爲左小右大兩段,各段再遞歸比較直到排好。
- 要把握的核心是:每次比較交換後後,需排序小數組的首尾標號更新。
以下代碼參考了 https://www.cnblogs.com/qsyll0916/p/7496886.html 並修改,加以詳細扼要註釋(精華都在註釋和變量名中),回顧快速排序的學習歷程,自認爲比絕大部分長篇大論及圖片動畫來的直接清晰。
代碼如下:
#include <stdio.h>
/*
快速排序算法學習
原理:依次拿基準值(可取起始值)比較尾、首,目標是將一段數字以基準值分爲左小右大兩段,各段再遞歸比較直到排好。
參考 https://www.cnblogs.com/qsyll0916/p/7496886.html 並修改、加詳細扼要註釋。
*/
void print_array(int arr[], int n) // 打印數組
{
for (int i = 0; i < n; i++)
printf("%5d", arr[i]);
printf("\n");
}
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
/**********************************
fuction:快速排序函數
int arr[]:初始數組
int index_begin:初始數組的起始下標
int index_end:初始數組的末尾下標
***********************************/
void quickSort_s(int arr[], int index_begin, int index_end)
{
// 新一輪遞歸用
int temp_begin = index_begin; // 詳見第二輪解釋
int temp_end = index_end;
if (temp_begin >= temp_end) // 如果新一輪開始時,排序組的兩端已經在同一個點,就不需再排序了
return;
// 第一輪排序
int baseValue = arr[index_begin]; // 本代碼中這個值只能是起始值,不能換
while (index_begin < index_end)
{
while (index_begin < index_end && baseValue < arr[index_end]) // 末端起,若尾大,不交換,尾部左移;尾小不移,開始交換
index_end--;
if (index_begin < index_end)
{
swap(&arr[index_begin], &arr[index_end]);
print_array(arr, 8);
index_begin++; // 換後右移
}
while (index_begin < index_end && baseValue > arr[index_begin]) // 若首部小,不交換,首部右移;首大不移,開始交換
index_begin++;
if (index_begin < index_end)
{
swap(&arr[index_begin], &arr[index_end]);
print_array(arr, 8);
index_end--; // 換後左移
}
//printf("beginI= %d endI= %d\n", index_begin, index_end);
}
// 第二輪排序,調用第一輪的步驟-遞歸
int mid_index = index_begin; // 第二輪兩段分界點
// 第一輪結束後的index_begin和index_end都已經轉移到分界點這個位置,因此第二輪不能直接使用這兩個參數,
// 可以在前一輪開始前記錄兩端位置,新一輪開始時再用做兩端。
quickSort_s(arr, temp_begin, mid_index - 1);
quickSort_s(arr, mid_index + 1, temp_end);
}
int main()
{
int myArr[] = { 5,2,7,9,0,8,1,4 };
int arrLength = sizeof(myArr) / sizeof(int);
print_array(myArr, arrLength);
quickSort_s(myArr, 0, arrLength - 1);
printf("\nDone:\n");
print_array(myArr, arrLength);
getchar();
return 0;
}