一头扎进《快速排序》

2024-02-28 06:48
文章标签 快速 排序 一头 扎进

本文主要是介绍一头扎进《快速排序》,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一头扎进《快速排序》

今天去听了一个讲座,师姐很厉害,在她的演讲中她提到了很多东西,未能够及时消化,回来马上开始码文档。师姐今天提及快排,但是要求我们要用**非递归**来实现。以前并没有很在意这些细节,想着能理解写出来不就可以了吗,今天特来写博文认错。
大家知道快排效率为O(N*logN),在这几种排序方法中也算是效率较为高的一种算法了,采用的是“分治法”的思想,百度上描述为“是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)”。
快速排序(分治法)的主要思想是:

1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
我们日常都是喜欢用递归实现这么一个过程,简单,我就先写一下递归的做法,然后在用非递归的方式完成该算法操作。
具体代码如下所示(java实现):

/** **快速排序用递归实现***/
public class SortDemo {public static void quick_sort(int s[], int l, int r) {if (l < r) {int i = l, j = r, x = s[l];while (i < j) {while (i < j && s[j] >= x)// 从右向左找第一个小于x的数j--;if (i < j)s[i++] = s[j];while (i < j && s[i] < x)// 从左向右找第一个大于等于x的数i++;if (i < j)s[j--] = s[i];}s[i] = x;quick_sort(s, l, i - 1); // 递归调用quick_sort(s, i + 1, r);}}public static void main(String[] args) {int[] a={7,12,2,45,6,8,52};quick_sort(a, 0, a.length-1);for (int i=0;i<a.length;i++) {System.out.print(a[i]+" ");}}
}

——– ——————- 分割线————————————

/

快速排序之非递归实现

先分析快速排序和冒泡排序的一些共同点:
- 都要经历n趟排序
- 每趟排序要经历O(n)次比较
- 都是后半部分元素比前半部大
不同之处就在于冒泡排序的交换操作发生相邻的元素之间,即一趟排序可以要经过多次交换操作;快速排序的交换操作发生在间隔比较远的两个元素之间,一趟排序要经过交换操作次数会少一些。
下面是非递归实现:

  1. // start和end为前闭后闭  
  2. private static void nonRec_quickSort(int[] a, int start, int end) {  
  3.     // 用栈模拟  
  4.     Stack<Integer> stack = new Stack<>();  
  5.     if (start < end) {  
  6.         stack.push(end);  
  7.         stack.push(start);  
  8.         while (!stack.isEmpty()) {  
  9.             int l = stack.pop();  
  10.             int r = stack.pop();  
  11.             int index = partition(a, l, r);  
  12.             if (l < index - 1) {  
  13.                 stack.push(index - 1);  
  14.                 stack.push(l);  
  15.             }  
  16.             if (r > index + 1) {  
  17.                 stack.push(r);  
  18.                 stack.push(index + 1);  
  19.             }  
  20.         }  
  21.     }  
  22.     System.out.println(Arrays.toString(a));  
  23. }  
  24. private static int partition(int[] a, int start, int end) {  
  25.     int pivot = a[start];  
  26.     while (start < end) {  
  27.         while (start < end && a[end] >= pivot)  
  28.             end--;  
  29.         a[start] = a[end];  
  30.         while (start < end && a[start] <= pivot)  
  31.             start++;  
  32.         a[end] = a[start];  
  33.     }  
  34.     a[start] = pivot;  
  35.     return start;  
  36. }  

这篇关于一头扎进《快速排序》的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/754691

相关文章

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

v0.dev快速开发

探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之效率。 何谓v0.dev? v0.dev者,现代化之开发者工具也,旨在简化并加速软件开发之过程。其集多种功能于一体,助开发者高效编写、测试及部署代码。无论汝为前端开发者、后端开发者

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

【软考】希尔排序算法分析

目录 1. c代码2. 运行截图3. 运行解析 1. c代码 #include <stdio.h>#include <stdlib.h> void shellSort(int data[], int n){// 划分的数组,例如8个数则为[4, 2, 1]int *delta;int k;// i控制delta的轮次int i;// 临时变量,换值int temp;in

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简