#include<stdio.h>
//2020 0330 6:36
int findpos(int* a,int low,int high)//此函数功能将数组的第一个元素位置找到
{
int val; //临时值变量 ,储存第一个元素的值,将通过这个值与数组中的每个值进行比较。从而确定第一个元素的位置,用升序为例,最终结果一定是左边都是比自己小的元素,右边都是比自己大的元素。
val=a[low];//将第一个元素的值赋给临时值变量
while(low<high) //(循环结束条件是下标重合)
{
while(low<high&&a[high]>=val)
high--; //两个while循环的条件是当左边都是小于临时值的元素,右边都是大于临时值的元素移动下标。当不满足条件(比第一个元素大的元素出现在左侧,比第一个元素小的出现在右侧),while循环结束。此时需要赋值,就是把小的赋给左面,大的赋给右面(赋值就相当于一种元素的移动)。
a[low]=a[high];
while(low<high&&a[low]<=val)
low++;
a[high]=a[low];
}
a[high]=val; //或者是a[low]跑到了它在升序时正确的位置,将临时值赋给它(因为这个值本来就是它的值)
return low; //或者是high,返回谁都一样,都代表第一个元素的位置
}
void quicksort(int* a,int low,int high) //思路:先找第一个位置,此时数组被半劈 然后在递归排左边,递归排右
{
int pos; //确定第一个元素位置
if(low<high)
{
pos=findpos(a,low,high); //找到了第一个的位置
quicksort(a,low,pos-1); //在确定第一个位置以后,此时数组被切割。把左侧当作一个新的待排序的数组。因为quicksort();函数功能就是找到第一个元素的位置,所以此时需理解递归思想,自己调用自己。
quicksort(a,pos+1,high); //同理
}
}
int main(void)
{
int i;
int a[6]={5,2,-9,4,6,8}; //定义数组
quicksort(a,0,5); //调用快排函数(得到的是按升序排列的数组)
for(i=0;i<6;i++) //输出排序后数组
{
printf("%d ",a[i]);
}
return 0;
}
/*
算法的思想是定义两个下标(左侧对应low,右侧对于high)和一个临时值变量val(**本质就是确定第一个元素的位置,所以一定要知道它的值才可以和数组中其他元素比较**,其他元素的值都是通过这个左右两侧的下标找到的。因为实现排序功能,(**用下标不仅可以找到左右两侧数组元素与第一个元素进行比较,还可方便进行赋值(可以理解为元素是移动)。**
实现这种算法在计算机中主要是利用递归的思想,想确定每一个元素的位置,只要不停的找到第一个元素的位置,最终就会找到所有元素的位置。该程序值得注意的点是**几乎每一步都要考虑下标low与下标high之间是否重合(即low=high,此时左侧元素和右侧元素都已经和val进行过比较了,此时位置确定,跳出循环)**在findpos();函数中为何先从high下标开始移动,我的想法是这可能更符合生活中的思维逻辑,比如这个算法为了实现升序,我们都喜欢将小的先排在左侧,而不是先把大的排在右侧。(一本正经的胡说八道)
本人在b站自学郝斌老师的c语言和数据结构三个月有余,可是总觉得什么都没有学到,我分析原因是自己并没有真正弄懂老师的每一步思想,总是一知半解,时间长了,就越来越糊涂。这个程序的注释很多不值得新手参考,因为我也是新手,我更多的是希望有人指出我思想的错误,也希望和我有同样错误认识的新手都可以通过这篇文章的讨论区解决疑惑。
*/
郝斌数据结构第76节课堂程序——快速排序(简单升序)
最新推荐文章于 2021-09-26 14:38:20 发布