简述
快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),一种排序算法,最早由东尼·霍尔提出。
快速排序使用分治法(Divide and conquer)策略来把一个序列 (list)分为两个子序列(sub-lists)。
基本思路
- 在数列中选择一个数为“基准”;
- 将比“基准”小的数放在前边,比“基准”大的数放在后边,这样第一个分区就已经做好;
- 将数列分为两个字序列,一个之中放的全是比基准小的数,另一个放的则是比基准大的数,然后再进行如上操作【即用递归的思想】直到字数列中只有一个数,最后得到的便是排序完成后的序列。
代码实现(C)
void swap(int *a, int *b)函数
void swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
快排函数
void sort(int *arr, int start, int end)
{
if (start >= end)
return ;
int left = start;
int right = end-1;
int mid = arr[end]; //将最后一个数设置为基准
while(left < right)
{
while(arr[left] < mid && left < right) //左边找比基准大的数
left++;
while(arr[right] > mid && left < right) //右边找比基准小的数
right--;
swap(&arr[left], &arr[right]); //将两个数位置交换,让小于基准的数去左边,大于基准的数去右边
}
//看注释1⃣
if(arr[left] >= mid)
swap(&arr[left], &arr[end]);
else
left++;
//判断left是否到了最左边「即left = 0」
if(left)
{
sort(arr, start, left-1); //这时不再动arr[left]的位置,将它左边的序列和它右边的序列继续排列
sort(arr, left+1, end);
}else
sort(arr, left+1, end);
}
注释
注释1⃣️:
如有建议请在下方评论,一起交流探讨。