小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
引
说到快速排序,可能大家都不会陌生。今天的算法课程中,学到了快速排序的两种中间实现步骤,给大家分享一下。
1.快速排序的思想
首先还是过一遍快速排序的基本思想。
用我自己的话总结一下,就是:
- 在比较序列中取关键值key
- 将序列中比key值大的放在key的一侧,比key值小的放在另一则
- 分别对左右两侧重复进行1、2操作
从步骤中我们能够清晰地明白这是一种分而治之的思想,因此在代码中的体现就是使用递归。
2.对于步骤2的解析
作为算法的主要部分,我们需要知道如何实现步骤2,即将大的放在一边,小的放在另一边。
从字面上来看,这个步骤似乎实现起来并不难,但我们的算法依然有许多考究之处。
[图片来源](【算法】排序算法之快速排序 - 知乎 (zhihu.com))
2.1
左右分开找
int partition(int arr[], int low, int high){
int key;
key = arr[low];
while(low<high){
while(low <high && arr[high]>= key )
high--;
if(low<high)
arr[low++] = arr[high];
while( low<high && arr[low]<=key )
low++;
if(low<high)
arr[high--] = arr[low];
}
arr[low] = key;
return low;
}
具体思路参考下图
[图片来源]( 快速排序的两种实现方法(c语言版本)_雪峰流云-CSDN博客)
2.2
从一端“过滤”
int partition(int arr[], int low, int high){
int i=high;
int m=high;
int key =arr[high];
while(i>=low){
if(arr[i]>key){
int temp=arr[m];
arr[i]=arr[m];
arr[m]=temp;
m--;
}
i--;
}
int temp=arr[high];
arr[high]=arr[m+1];
arr[m+1]=temp;
printf("\n%d",m);
return m+1;
}