版权声明:转载需标明该文链接。 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;
}