快速排序

[算法] 快速排序

一世执手 提交于 2020-01-10 01:12:18
# 快速排序递归玩法 def quicksort(arr): # 结束条件 if len(arr) <= 1: return arr # 用中间值更稳定 middle = arr[len(arr) // 2] # 记得将middle拿出来,最后再放到中间 del arr[len(arr) // 2] # 利用列表生成式,100W数据,2.9s # left = [x for x in arr if x <= middle] # right = [x for x in arr if x > middle] # 2.6s left = [] right = [] for x in arr: left.append(x) if x <= middle else right.append(x) # 记得把middle放中间 return quicksort(left) + [middle] + quicksort(right) # 非递归玩法 def quicksort2(arr): ''' 模拟栈操作实现非递归的快速排序 ''' if len(arr) < 2: return arr stack = [] stack.append(len(arr) - 1) stack.append(0) while stack: l = stack.pop() r = stack.pop()

7-7、快速排序的实现

情到浓时终转凉″ 提交于 2020-01-10 00:15:00
用快速排序算法对一组待排序数据进行排序。实现如下操作:已知数组A[n]为整型的元素,将其用快速排序算法进行排序,要求输出排序以后的数据,元素之间用一个空格隔开。 注意:待排序数据元素的个数n和n个数据元素的值依次由键盘输入。 输入格式: 输入元素的个数n 输入n个待排序的元素的值,使用空格分隔 输出格式: 输出排好序的元素,使用空格分隔 输入样例: 10 59 20 17 36 98 14 23 83 13 28 输出样例: 13 14 17 20 23 28 36 59 83 98 #include using namespace std; void QuickSort(int q[],int l,int r); int main() { int N; cin>>N; int a[N]; for(int i=0;i<N;i++) { cin>>a[i]; } QuickSort(a,0,N-1); for(int k=0;k<N;k++) { cout<<a[k]; if(k<N-1) cout<<" "; } return 0; } void QuickSort(int q[],int l,int r) { if(l>=r)return; int i=l-1,j=r+1,x=q[l+r>>1]; while(i<j){ do i++;while(q[i]<x); do j–

05排序之快速排序

非 Y 不嫁゛ 提交于 2020-01-06 23:16:09
快速排序 数据结构整理目录 基本介绍 快速排序是对冒泡排序的一种改进,基本思想是: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都要小; 然后再按此方法对两部分数据分别进行快速排序’ 整个排序过程可以 递归进行 以此达到整个数据变成有序序列。 分析 代码实现 package F排序 ; import java . util . Arrays ; /** * @Author Zhou jian * @Date 2020 ${month} 2020/1/4 0004 15:37 * 快速排序 */ public class QuickSort { public static void main ( String [ ] args ) { int [ ] arr = { - 9 , 78 , 0 , 23 , - 567 , 70 } ; quickSort ( arr , 0 , arr . length - 1 ) ; } public static void quickSort ( int [ ] arr , int left , int right ) { int l = left ; //左索引 int r = right ; //右索引 //中轴 int pivot = arr [ ( left + right ) / 2 ] ;

快速排序和归并排序

走远了吗. 提交于 2020-01-03 05:24:41
1,快速排序 快速排序通过分割值列,然后递归的对两个部分进行排序,从而实现对值列的排序。它的基本思想是:通过一趟排序将要排序的 数据分割 成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序 首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序 。 怎么实现呢?--- 它的关键在于完成一趟快排后,基准元素在哪个位置,每次都选取一个分割列的第一个元素作为基准元素,来寻找用它来分割排序列后它自己所处的位置,编写一个 int findPartition(data,min,max)方法,用于 使用data[min]作为基准元素把data[min]到data[max]分割为两个部分,并返回分割以后基准元素自己所在的位置索引。 在主函数里这样来调用: public static void quickSort(Comparable[] data,int min,int max) { int mid; if(min < max) { mid = findPartition(data,min,max); quickSort(data,min,mid-1); quickSort(data,mid+1,max); } } 理解递归过程:::if(min <

java数据结构之排序

不想你离开。 提交于 2020-01-03 05:05:04
写在前面的话:本篇文章是我自己阅读程杰老师的大话数据结构之后自己所做的总结,网上有很多关于排序的详细介绍,我推荐 伍迷家园 所写的文章,介绍的非常详细。 排序是我们在程序中经常要用到的一种算法,好的排序可以极大的提高我们的工作效率,本篇主要介绍几种常见的排序算法; (简单说明: 下面的java程序是用来排序的,其中sum为排序数组,sum[0]不进行排序,只作为哨兵或者临时变量) 1、冒泡排序: 冒泡排序是一种交换排序,其的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。 1 //冒泡排序2 最正宗的冒泡排序,i每循环一次,最小的数就像气泡一样慢慢浮到水面上 2 public static void BubbleSort_2(int[] num){ 3 for(int i = 1; i < num.length; i++){ 4 for(int j = num.length-1; j > i; j--){ 5 if(num[j-1] > num[j]){ 6 Swap(num,j-1,j); //交换函数 交换num[j-1]和num[j]的值 7 } 8 } 9 } 10 } 2、选择排序: 简单选择排序法(Simple Selection Sort)就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1≤i≤n

排序算法汇总

删除回忆录丶 提交于 2020-01-03 05:02:57
1.排序算法简要比较 名称 数据对象 稳定性 时间复杂度 空间复杂度 描述 平均 最坏 插入排序 数组、链表 √ O(1) (有序区,无序区)。把无序区的第一个元素插入到有序区的合适的位置。对数组:比较得少,换得多。 直接选择排序 数组 × O(1) (有序区,无序区)。在无序区里找一个最小的元素跟在有序区的后面。 对数组:比较得多,换得少。 链表 √ 堆排序 数组 × O(nlogn) O(1) (最大堆,有序区)。从堆顶把根卸出来放在有序区之前,再恢复堆。 归并排序 数组、链表 √ O(nlogn) O(n) +O(logn) , 如果不是从下到上 把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。可从上到下或从下到上进行。 快速排序 数组 × O(nlogn) O(logn) ,O(n) (小数,枢纽元,大数)。 Accum qsort 链表 √ O(nlogn) O(logn) ,O(n) (无序区,有序区)。把无序区分为(小数,枢纽元,大数),从后到前压入有序区。 决策树排序 √ O(logn!) O(n!) O(n) <O(logn!) <O(nlogn) 计数排序 数组、链表 √ O(n) O(n+m) 统计小于等于该元素值的元素的个数 i,于是该元素就放在目标数组的索引 i位。(i≥0) 桶排序 数组、链表 √ O(n) O(m) 将值为 i 的元素放入i

面试准备(算法部分)

断了今生、忘了曾经 提交于 2020-01-03 04:58:40
No.1 冒泡排序 冒泡排序无疑是最为出名的排序算法之一,从序列的一端开始往另一端冒泡(你可以从左往右冒泡,也可以从右往左冒泡,看心情),依次比较相邻的两个数的大小(到底是比大还是比小也看你心情)。 冒泡排序动图演示 图解冒泡排序 以 [ 8,2,5,9,7 ] 这组数字来做示例,上图来战: 从左往右依次冒泡,将小的往右移动 冒泡排序1 首先比较第一个数和第二个数的大小,我们发现 2 比 8 要小,那么保持原位,不做改动。位置还是 8,2,5,9,7 。 指针往右移动一格,接着比较: 冒泡排序2 比较第二个数和第三个数的大小,发现 2 比 5 要小,所以位置交换,交换后数组更新为:[ 8,5,2,9,7 ]。 指针再往右移动一格,继续比较: 冒泡排序3 比较第三个数和第四个数的大小,发现 2 比 9 要小,所以位置交换,交换后数组更新为:[ 8,5,9,2,7 ] 同样,指针再往右移动,继续比较: 冒泡排序4 比较第 4 个数和第 5 个数的大小,发现 2 比 7 要小,所以位置交换,交换后数组更新为:[ 8,5,9,7,2 ] 下一步,指针再往右移动,发现已经到底了,则本轮冒泡结束,处于最右边的 2 就是已经排好序的数字。 通过这一轮不断的对比交换,数组中最小的数字移动到了最右边。 接下来继续第二轮冒泡: 冒泡排序5 冒泡排序6 冒泡排序7 由于右边的 2 已经是排好序的数字

快速排序(双指针扫法)

人走茶凉 提交于 2020-01-01 20:28:24
快速排序(双指针) 快速排序是对冒泡排序的一种优化,而双指针又比基础的方法快。在数组的开头和结尾各定义一个指针i和j,在定义一个哨兵vot用于分区,双指针法是交换两个指针在固定状态下的数据,减少交换次数,从而提高速度。 下面上代码 package sort ; public class quicksort { public static void main ( String [ ] args ) { int a [ ] = { 9 , 5 , 7 , 3 , 8 , 4 , 2 , 6 , 1 } ; quicksort ( a , 0 , a . length - 1 ) ; for ( int i = 0 ; i < a . length ; i ++ ) { System . out . print ( a [ i ] + " " ) ; } } private static void quicksort ( int a [ ] , int begin , int end ) { //排序开始的条件 if ( begin >= 0 && end < a . length && begin < end ) { //定义指针,x开始指针,y末尾指针 int x = begin , y = end ; //定义哨兵 int vot = a [ x ] ; //记录哨兵位置 int

JAVA数据结构--快速排序

≯℡__Kan透↙ 提交于 2019-12-31 22:09:30
快排概念 快速排序 ( 英语: Quicksort),又称 划分交换排序 ( partition-exchange sort),一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序 个项目要 (大O符号)次比较。在最坏状况下则需要 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 实现思想 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。 步骤为: 从数列中挑出一个元素,称为"基准"(pivot), 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为 分区(partition) 操作。 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。 递归到最底部时,数列的大小是零或一,也就是已经排序好了。这个算法一定会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。 借用下啊哈算法的图: i和j分别为左哨兵和右哨兵,这里枢纽元定为6,然后分别从左往右(i++)和右往左(j--)开始遍历 左哨兵查找比6大的元素

分治法:用C#实现快速排序

江枫思渺然 提交于 2019-12-31 02:01:33
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 namespace QuickSort 6 { 7 class Program 8 { 9 static void Main( string [] args) 10 { 11 int [] a = new int [] { 4 , 2 , 1 , 6 , 3 , 6 , 0 , - 5 , 1 , 1 } ; 12 13 QuickSort q = new QuickSort(); 14 q.Init(a); 15 q.Sort( 0 , a.Length - 1 ); 16 17 int [] r = q.GetResult(); 18 19 if (r != null ) 20 { 21 for ( int i = 0 ; i < r.Length; i ++ ) 22 { 23 System.Console.WriteLine(r[i]); 24 } 25 } 26 } 27 } 28 29 class QuickSort 30 { 31 private int [] _toBeSort; 32 33 private bool _isSort; 34 35 public void Init( int [] toBeSort)