十大排序算法之(二)快速排序--JAVA+C++实现(简单易懂)

文章目录

  • 快速排序(Quicksort)
  • 1、实现原理:
    • 1.1、动图展示:
    • 1.2、实现步骤:
  • 2、时间复杂度
  • 3、代码实现:
    • 3.1、JAVA 实现
    • 3.2、C++实现
    • 3.3、C语言实现
    • 3.4、C语言递归实现:

快速排序(Quicksort)

快速排序是对冒泡排序算法的一种改进。其基本思想是基于分治法的:在待排序表 L [ ln ]中任取一个元素 pivot 作为枢轴(或基准,通常取首元素),通过一趟排序将待排序表划分为独立的两部分 L [ lk —1]和 L [ k + ln ],使得 L [1k—1]中的所有元素小于 pivot , L [ k +1n]中的所有元素大于等于 pivot ,则 pivot 放在了其最终位置 L ( k )上,这个过程称为一趟快速排序(或一次划分)。然后分别递归地对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素放在了其最终位置上。

1、实现原理:

1.1、动图展示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2、实现步骤:

1、从数列中挑出一个元素,称为 “基准”(pivot);

2、重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
3、递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

2、时间复杂度

快速排序的平均时间复杂度也是O(nlog2n)

3、代码实现:

3.1、JAVA 实现

public class QuickSort implements IArraySort {@Overridepublic int[] sort(int[] sourceArray) throws Exception {// 对 arr 进行拷贝,不改变参数内容int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);return quickSort(arr, 0, arr.length - 1);}private int[] quickSort(int[] arr, int left, int right) {if (left < right) {int partitionIndex = partition(arr, left, right);quickSort(arr, left, partitionIndex - 1);quickSort(arr, partitionIndex + 1, right);}return arr;}private int partition(int[] arr, int left, int right) {// 设定基准值(pivot)int pivot = left;int index = pivot + 1;for (int i = index; i <= right; i++) {if (arr[i] < arr[pivot]) {swap(arr, i, index);index++;}}swap(arr, pivot, index - 1);return index - 1;}private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}

3.2、C++实现

// 参考:http://www.dutor.net/index.php/2011/04/recursive-iterative-quick-sort/
struct Range {int start, end;Range(int s = 0, int e = 0) {start = s, end = e;}
};
template <typename T> // 整數或浮點數皆可使用,若要使用物件(class)時必須設定"小於"(<)、"大於"(>)、"不小於"(>=)的運算子功能
void quick_sort(T arr[], const int len) {if (len <= 0)return; // 避免len等於負值時宣告堆疊陣列當機// r[]模擬堆疊,p為數量,r[p++]為push,r[--p]為pop且取得元素Range r[len];int p = 0;r[p++] = Range(0, len - 1);while (p) {Range range = r[--p];if (range.start >= range.end)continue;T mid = arr[range.end];int left = range.start, right = range.end - 1;while (left < right) {while (arr[left] < mid && left < right) left++;while (arr[right] >= mid && left < right) right--;std::swap(arr[left], arr[right]);}if (arr[left] >= arr[range.end])std::swap(arr[left], arr[range.end]);elseleft++;r[p++] = Range(range.start, left - 1);r[p++] = Range(left + 1, range.end);}
}

3.3、C语言实现

typedef struct _Range {int start, end;
} Range;Range new_Range(int s, int e) {Range r;r.start = s;r.end = e;return r;
}void swap(int *x, int *y) {int t = *x;*x = *y;*y = t;
}void quick_sort(int arr[], const int len) {if (len <= 0)return; // 避免len等於負值時引發段錯誤(Segment Fault)// r[]模擬列表,p為數量,r[p++]為push,r[--p]為pop且取得元素Range r[len];int p = 0;r[p++] = new_Range(0, len - 1);while (p) {Range range = r[--p];if (range.start >= range.end)continue;int mid = arr[(range.start + range.end) / 2]; // 選取中間點為基準點int left = range.start, right = range.end;do {while (arr[left] < mid) ++left;   // 檢測基準點左側是否符合要求while (arr[right] > mid) --right; //檢測基準點右側是否符合要求if (left <= right) {swap(&arr[left], &arr[right]);left++;right--;               // 移動指針以繼續}} while (left <= right);if (range.start < right) r[p++] = new_Range(range.start, right);if (range.end > left) r[p++] = new_Range(left, range.end);}
}

3.4、C语言递归实现:

void swap(int *x, int *y) {int t = *x;*x = *y;*y = t;
}void quick_sort_recursive(int arr[], int start, int end) {if (start >= end)return;int mid = arr[end];int left = start, right = end - 1;while (left < right) {while (arr[left] < mid && left < right)left++;while (arr[right] >= mid && left < right)right--;swap(&arr[left], &arr[right]);}if (arr[left] >= arr[end])swap(&arr[left], &arr[end]);elseleft++;if (left)quick_sort_recursive(arr, start, left - 1);quick_sort_recursive(arr, left + 1, end);
}void quick_sort(int arr[], int len) {quick_sort_recursive(arr, 0, len - 1);
}

如果对您有帮助,那么我非常开心,如果有什么想说的请在下面留言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/251462.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

《数据结构与算法》(二十五)- 排序算法:快速排序

目录 前言1. 快速排序1.1 快速排序算法1.2 快速排序算法复杂度分析1.3 快速排序优化 2. 总结 原文地址&#xff1a;https://program-park.github.io/2021/11/24/algorithm_25/ 前言 部分内容摘自程杰的《大话数据结构》 1. 快速排序 快速排序算法最早由图灵奖获得者 Tony Hoar…

c语言的快速排序,C语言实现快速排序法(分治法)

title: 快速排序法(quick sort) tags: 分治法(divide and conquer method) grammar_cjkRuby: true 算法原理 分治法的基本思想:将原问题分解为若干个更小的与原问题相似的问题,然后递归解决各个子问题,最后再将各个子问题的解组合成原问题的解。 利用分治法可以将解决办法分…

面了个蚂蚁金服拿38K出来的,真是砂纸擦屁股,给我露了一手啊

今年的春招结束&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好&#xff0c;他山之石&…

10:mysql----存储引擎--进阶篇

目录 1:MySQL体系结构 2:存储引擎简介 3:存储引擎特点 4:存储引擎选择 1:MySQL体系结构 连接层 : 最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。 服务层 :…

vivo android 6.0 root,vivo X6 A(全网通)如何获取ROOT权限教程

vivo X6 A(全网通)怎么ROOT?vivo X6 A(全网通)ROOT工具选用哪些?如何避免vivo X6 A(全网通)ROOT失败?带着这些疑问来搜索vivo X6 A(全网通)ROOT方法的机友很多。小编推荐这篇vivo X6 A(全网通)一键ROOT教程&#xff0c;具体步骤如下&#xff1a; 1.首先打开奇兔刷机软件&…

Yoyo OS安装过程

Yoyo OS是星火社区开发的一个系统&#xff0c;今天教你如何安装 百度搜索星火应用商店 点击社区 点击Yoyo OS 点击立即下载 点击下载 下载完成后刻录到U盘&#xff08;过程我就不详细介绍了&#xff0c;网上有很多教程&#xff0c;也可以参照我的这篇文章部分来刻录http://t.c…

2022年520最实用的礼物,苹果平板的触控笔

下周就是520了&#xff0c;还没选好礼物的人紧张起来了&#xff01;数码产品可以选择什么作为礼物呢&#xff1f;特别是对于学生党来说&#xff0c;什么是便宜又实用的礼物&#xff1f;我觉得如果对方有苹果平板的电脑的话&#xff0c;选择送一支触控笔是很实用的礼物&#xff…

win10 平板 刷android,Android平板电脑刷Win8 ARM平台将支持Win10

在2015年台北计算机展上&#xff0c;我们首次发现了具有ARM架构的Windows平板电脑. 众所周知&#xff0c;Windows平板电脑只能安装在x86体系结构设备上. 这次曝光是世界上第一个非x86架构Windows平板电脑&#xff0c;因此具有重要意义. 这款非x86架构平板电脑配备了Rockchip的R…

平板电脑硬件如何测试软件,先锋(Pioneer)G71平板电脑软件测试评测-ZOL中关村在线...

谷歌对旗下的智能操作系统Android采取了开源的做法&#xff0c;所以说也就造成了它相较于苹果iOS以及微软Windows系统严重的碎片化现象&#xff0c;当然我们也看到了像三星 TouchWiz UX&#xff0c;HTC Sense UI以及小米 MIUI这些非常成熟且易用的第三方固件&#xff0c;只是它…

苹果xr如何截屏_苹果手机如何单手操作截屏

我们在使用手机过程中&#xff0c;遇到一些优质的文章或者图片时&#xff0c;都会习惯性截屏起来与朋友分享。在截屏过程中&#xff0c;由于手机屏幕太大的原因&#xff0c;一般都要用两个手去操作&#xff0c;一个手按住Home键&#xff0c;另一个手按住电源键&#xff0c;在同…

苹果平板id怎么注册_怎么做成苹果笔记?苹果平板怎么做笔记? - 敬业签便签...

很多朋友&#xff0c;尤其是经常接触电子产品的小伙伴&#xff0c;对于苹果都不陌生。这里说的苹果并不是传统意义上的植物水果&#xff0c;而是科技产品公司。苹果旗下的电子产品有很多&#xff0c;常见的有苹果手机、苹果平板、耳机以及Mac电脑等等。那么怎么做成苹果笔记&am…

苹果xr如何截屏_苹果手机居然自带长截屏功能了?iPhone的多种截屏方式,涨知识了...

苹果手机和安卓手机各有千秋&#xff0c;很多使用苹果手机的小伙伴都说&#xff0c;安卓手机截长图这么简单&#xff0c;为什么苹果手机还需要下载一些软件才行&#xff1f;今天小编就来分享一下苹果手机的截图方式以及升级了iOS13之后如何长截屏。 一、传统的按键截屏 这种截屏…

ipad一直卡在白苹果_近万字多图带你玩转iPad——iPad指南

本文由什么值得买用户原创&#xff1a;麦豆爸爸 从2010年发布至今&#xff0c;iPad已经有9年的历史。时至今日&#xff0c;平板市场只分为iPad和其他&#xff0c;可见iPad在平板的主导地位。有人说iPad就是一大号的iPhone&#xff0c;娱乐设备&#xff0c;刷剧利器&#xff0c;…

苹果6如何截屏_苹果升级iOS14,轻点背面能开启截屏功能,真是太方便了

分享最实在的玩机技巧&#xff0c;洞察最前沿的科技资讯&#xff01;大家好&#xff0c;这里是手机科技园&#xff01; 苹果手机已经进入了全面屏时代&#xff0c;以前我们在手机上截屏&#xff0c;都是借助音量键和主屏幕键&#xff0c;共同完成截图&#xff0c;那么全面屏手机…

android平板的隐藏空间如何开启,平板电脑怎么截图和怎么隐藏游戏?

无论是我们国内还是国外都有大批的苹果爱好者,对比我们国产的平板品牌,苹果在系统上确实有很大的优势。苹果旗下的平板系列众多,一代一代的升级,每一代都有自己的特色。不同于笔记本电脑,平板电脑的便携性更强。下面就为大家介绍一下平板电脑怎么截图和怎么隐藏游戏? 苹果…

建设银行app流水申请

1、打开建设银行APP&#xff0c;点击“账户” 我的账户 2、点击“活期账户交易明细申请“ 活期账户交易明细申请 3、选择“明细申请” 明细申请 4、导出近半年的流水记录 4.jpg 5、在申请记录中查看解压密码 解压密码

数据仓库建设及数据治理总结

在谈数仓之前&#xff0c;先来看下面几个问题&#xff1a; 数仓为什么要分层&#xff1f; 用空间换时间&#xff0c;通过大量的预处理来提升应用系统的用户体验&#xff08;效率&#xff09;&#xff0c;因此数据仓库会存在大量冗余的数据&#xff1b;不分层的话&#xff0c;如…

数仓建设(离线和实时)

文档大纲&#xff1a; 一、数仓基本概念 1. 数据仓库架构 我们在谈数仓之前&#xff0c;为了让大家有直观的认识&#xff0c;先来谈数仓架构&#xff0c;“架构”是什么&#xff1f;这个问题从来就没有一个准确的答案。这里我们引用一段话&#xff1a;在软件行业&#xff0c;…

数字经济下,银行线上场景化建设的服务颗粒度、用户忠诚度和生态融合度

在互联网浪潮下&#xff0c;银行金融服务催生出新业态。大中型银行纷纷入局场景生态化建设&#xff0c;以驱动线上获客渠道。目前&#xff0c;商业银行场景金融建设虽经历了从无到有的突破&#xff0c;但随着数字经济的快速发展&#xff0c;银行线上场景搭建迎来了新挑战。依靠…