快速排序是一种以分治为基本思想的排序算法,它将待排序数组分成两个子数组,将两部分再独立地排序。
快速排序最理想的情况是每次都能将序列切分成相同大小的两部分,因此切分所用的基准元素如何选择就成了影响算法性能的关键。最简单的实现就是采用相对位置固定的基准元素——一般是序列的第一个或最后一个元素。但这样往往会导致糟糕性能的出现,因为这样很容易出现很不平衡的切分序列。例如针对已经有序的序列或含有大量重复元素的序列。
快速排序三个重要操作:
选择基准元素
切分:以该基准在序列中的实际位置,把序列分成两个子序列。此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大
对切分得到的子数组进行快排(分治),直到序列为空或者只有一个元素。
int partition(int arr[], int left, int right)//快排核心----------划分函数
{
int key = arr[left];
while (left < right)
{
while (left < right && arr[right] > key)right--;
if(left<right) arr[left] = arr[right];
while (left < right && arr[left] <= key)left++;
if(left<right) arr[right] = arr[left];
}
arr[left] = key;
return left;
}
对于小序列来说,快速排序比插入排序要慢,因此在快排切分到子序列足够小时改调用插入排序能很好地提升性能。
void InsertSort(int arr[], int start, int end)
{
int tmp = arr[start];
for (in
快速排序及其优化
最新推荐文章于 2022-04-24 12:24:26 发布
![](https://img-home.csdnimg.cn/images/20240611030827.png)