十大排序算法之(二)快速排序--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);
}
如果对您有帮助,那么我非常开心,如果有什么想说的请在下面留言
十大排序算法之(二)快速排序--JAVA+C++实现(简单易懂)相关推荐
- 【十大排序算法系列】快速排序
写在前面 上一篇更新了这个系列的排序算法([十大排序算法系列]冒泡排序).分析了冒泡的逻辑和优化点,下面来写下快速排序(为什么跳这么快?因为比较走心hhhh) 照例给出系列内所有算法的对比.. 常见的 ...
- 十大排序算法代码集锦(java)
SortAlgorithm.java import java.util.*;class SortAlgorithm { //冒泡排序public int[] BubbleSort(int[] nums ...
- 十大排序算法之堆排序---(Java版)
简介:首先,这里的代码需要自己给数值给值,当然也可以参考我的代码,进行理解代码的执行. 如果代码有哪里不对的地方,希望小伙伴私聊讨论.谢谢,我在这里谢过了各位网友. 注意:这里的本作者只是给了带码还需 ...
- 经典十大排序算法(含升序降序,基数排序含负数排序)【Java版完整代码】【建议收藏系列】
经典十大排序算法[Java版完整代码] 写在前面的话 十大排序算法对比 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 插入排序 希尔排序 计数排序 桶排序 基数排序 完整测试类 写在前面的话 ...
- 八十八、Python | 十大排序算法系列(下篇)
@Author:Runsen @Date:2020/7/10 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...
- 十大排序算法(Java)
文章目录 十大排序算法(Java) 一.冒泡排序(Bubble Sort) 二.选择排序(Selection Sort) 三.堆排序(Heap Sort) 四.插入排序(Insertion Sort) ...
- JAVA十大排序算法动画_十大排序算法(java实现)
[前言]最近在重新研究算法,此篇博文供自己复习使用也为方便广大程序员同学!此文代码均为自己实现,通过对比经典解法校验,若有错请读者及时提出! - [对比分析图]首先,我们先来对比分析一下这十大排序算法 ...
- 十大排序算法之快速排序(两种方法)
十大排序算法之快速排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想:在待排序序列中选择一个分割元素,将待排序序列中所有比分割元素关键字小的元素移动到分割元素左侧位置:将待排序序列中所 ...
- 十大排序算法JS实现以及复杂度分析
文章目录 十大排序算法概述 应用场景 代码实现 一.冒泡排序 二.选择排序 三.插入排序 四.希尔排序 五.归并排序 六.快速排序 七.堆排序 八.计数排序 九.桶排序 十.基数排序 十大排序算法概述 ...
- 程序员必备十大排序算法
程序员必备十大排序算法 常见排序算法 基本概念 插入排序 直接插入排序 排序思路 排序过程 代码实现 算法分析 折半插入排序 排序思路 排序过程 代码实现 算法分析 希尔排序 排序思路 排序过程 代码 ...
最新文章
- 哈希表的实现(取余法)
- 易语言 精易模块 操作json数据
- 科学家用大脑控制平板电脑操作 真的可以!
- Go语言学习之3 流程控制、函数
- Maven 单独构建多模块项目中的子模块
- 李迟2021年4月知识总结
- H264 profile and level
- 队列-C语言-链表的实现方式
- 对TCP/IP协议的一些看法(13):IP路由
- 零基础学python还是c语言-零基础学Python之前需要学c语言吗
- 五年高考三年模拟暗部软件库_小老弟,你的《五年高考三年模拟》掉高速上了……...
- Hadoop安装教程_单机/伪分布式配置
- linux中提示没有unzip命令解决方法
- Indesign CS6怎么添加框线_InDesign用插件快速给文本文字添加拼音的方法
- 计算机新建里没有word,为什么右键新建没有word,右键没有新建word文档
- linux延迟加载so,WebRTC Linux ADM 实现中的符号延迟加载机制
- 网站备案 应该找域名商还是空间商备案
- C语言函数针对训练--递归篇(动画讲解,由易到难递归例题)
- 遥感图像计算机自动分类原理,第30讲:8.1遥感图像自动识别分类
- debian linux下载路径,Debian 常用命令,debian常用命令