【408数据结构与算法】—快速排序(十九)

简介: 【408数据结构与算法】—快速排序(十九)

一、🤣快速排序的基本思想

  • 任取一个元素(如:第一个)为中心
  • 所有比它小的元素一律前放,比它大的元素一律后放,形成左右两个子表
  • 对各子表重新选择中心元素并依此规则调整
  • 直到每个子表的元素只剩一个

二、😛快速排序演示

基本思想:通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录进行排序,以达到整个序列有序。

具体实现:选定一个中间数作为参考,所有元素与之比较,小的调到其左边,大的调到其右边

(枢轴)中间数:可以是第一个数,最后一个数、最中间一个数、任选一个数等

快速排序的特点

每一趟的子表的形成是采用从两头向中间交替式逼近法

快排算法

C语言实现快排

快排是在每轮挑选一个基准元素,并让其比他大的元素移动到数列一边,比他小的元素移动到数列的另一边,从而把数列拆解成两个部分,即分治思想。然后运用递归。

代码演示

#include <stdio.h>
void quickSort(int array[], int left, int right);
int main(void)
{
  int i;
  int array[] = { 5,4,3,2,1,10,9,8,7,6 }; //待排序数组
  int len = sizeof(array) / sizeof(int);  //数组的长度
  quickSort(array, 0, len - 1); //排序
  for (i = 0; i < 10; i++)  //打印排序后的数组
    printf("%d\n", array[i]);
  return 0;
}
void quickSort(int array[], int left, int right)
{
  int i, j, key;
  if (left >= right)
    return;
  i = left; j = right;
  key = array[i]; //取最左边的元素作为key
  while (i < j)
  { //始终保持i < j
    while (i < j && array[j] > key)//右指针向左
      j--;
    if (i < j)  //小于key的放左边
      array[i++] = array[j];
    while (i < j && array[i] < key)//左指针向右
      i++;
    if (i < j)  //大于key的放右边
      array[j--] = array[i];
  }
  array[i] = key; //最终将key放入i==j处
  quickSort(array, left, i - 1);  //左边递归
  quickSort(array, i + 1, right); //右边递归
}

快速排序算法分析

时间复杂度

空间复杂度

  • 快速排序不是原地排序
  • 由于程序中使用了递归,需要递归调用栈的支持,而栈的长度取决于递归调用的深度(即使不用递归,也需要使用用户栈)
  • 在平均的情况下,需要O(logn)的栈的空间
  • 最坏的情况下:栈空间可达O(n)

快速排序的稳定性

快速排序是一种不稳定的排序算法

思考题

由于每次枢轴记录的关键字都是大于其他所有记录的关键字,致使一次划分之后得到的子序列(1)的长度为0,这时候已经退化成为没有改进措施的冒泡排序。

快速排序不适于对原本有序或基本有序的记录序列进行排序。

快速排序算法分析

  • 划分元素的选取是影响时间性能的关键
  • 输入数据次序越乱,所划分元素值的随机性越好,排序速度越快,快速排序不是自然排序的方法
  • 改变划分元素的选取方法,至多只能改变算法平均情况下的世界性能,无法改变最坏情况下的时间性能。即最坏的情况下,快速排序的时间复杂性总是O(n^2)

👏👏👏总结


相关文章
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
397 4
|
7月前
|
算法 搜索推荐
快速排序-数据结构与算法
快速排序(Quick Sort)是一种基于分治法的高效排序算法。其核心思想是通过选择基准(pivot),将数组划分为左右两部分,使得左侧元素均小于基准,右侧元素均大于基准,然后递归地对左右两部分进行排序。时间复杂度平均为 O(n log n),最坏情况下为 O(n²)(如数组已有序)。空间复杂度为 O(1),属于原地排序,但稳定性不佳。 实现步骤包括编写 `partition` 核心逻辑、递归调用的 `quickSort` 和辅助函数 `swap`。优化方法有随机化基准和三数取中法,以减少最坏情况的发生。
511 13
|
12月前
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
280 61
|
10月前
|
搜索推荐 C++
【C++数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】
快速排序是一种高效的排序算法,基于分治策略。它的主要思想是通过选择一个基准元素(pivot),将数组划分成两部分。一部分的元素都小于等于基准元素,另一部分的元素都大于等于基准元素。然后对这两部分分别进行排序,最终使整个数组有序。(第一行是元素个数,第二行是待排序的原始关键字数据。本关任务:实现快速排序算法。开始你的任务吧,祝你成功!
259 7
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
407 1
|
搜索推荐
冒泡排序(Bubble Sort)以及选择排序(Selection Sort)和快速排序(Quick Sort)详细解析
冒泡排序(Bubble Sort)以及选择排序(Selection Sort)和快速排序(Quick Sort)详细解析
215 1
【初阶数据结构】打破递归束缚:掌握非递归版快速排序与归并排序
【初阶数据结构】打破递归束缚:掌握非递归版快速排序与归并排序
151 4
|
搜索推荐 Java Go
深入了解快速排序算法
深入了解快速排序算法
301 2
|
算法
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
191 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法

热门文章

最新文章