题目
本栏目是数据结构C语言版的十大排序算法,因为我只考常用的一些排序算法,所以会只更新一部分常用算法,每个排序分为算法思想,算法代码和执行结果三个部分展现。
更新第三篇:C语言实现快速排序
以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj。QQ:2394799692
一、算法思想
1.算法执行过程动图演示:
2.定义:
快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:
从数列中挑出一个元素,称为 “基准”(pivot);
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
3.算法思想:
通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
4.我的总结:
快速排序就是先找出来一个数当基准(一般找第一个元素),然后根据基准将待排序列分为左子表(小于基准的)和右子表(大于基准的),然后如此反复,直到每部分内只有一个元素或为空时即完成了整个数组的排序。
其算法的表现主要取决于递归深度,划分越均匀,递归深度越低。划分越不均匀,递归深度越深。
稳定性为:不稳定
>时间复杂度为:
好的情况:O(n^2)
坏的情况:O(n log n)
>空间复杂度为:
好的情况:O(n)
坏的情况:O(log n)
5.学习笔记:
二、代码部分
1.引入库
代码如下(示例):
#include<stdio.h>
2.主函数部分
代码如下(示例):
int divide(int a[], int low, int high)
{
int p = a[low];//以第一个元素作为基准
while (low < high)//用lwo,high搜索基准的最终位置
{
while (low < high && a[high] >= p)
high--;
a[low] = a[high];//找出比基准小的数将其移动到基准左边
while (low < high && a[low] <= p)
low++;
a[high] = a[low];//找出比基准小的数将其移动到基准右边
}
a[low] = p;//将基准存放到最终的中间位置
return low;//返回存放基准的最终位置
}
void quicksort(int a[], int low,int high)
{
if (low < high)//递归跳出的条件:low<high时说明整个数组已排序完成
{
int p = divide(a, low, high);//划分确定基准
quicksort(a, low, p - 1);//划分左子表
quicksort(a, p+1, high);//划分右子表
}
}
void main()
{
int a[] = { 1,2,3,4,9,8,7,6,5 };
int n = sizeof(a) / sizeof(int);
quicksort(a, 0,n-1);
for (int i = 0; i < n; i++)
printf("%d ", a[i]);
}
三、执行结果
输入:
a[] = { 1,2,3,4,9,8,7,6,5 };
输出:
1 2 3 4 5 6 7 8 9