快速排序

快速排序:找出最大最小的前K个数

一世执手 提交于 2020-02-03 05:17:33
快速排序:找出最大最小的前K个数 一.找出最小的k个数: 利用快速排序的原理,partition函数会找出mid值,mid左边的数都比mid小,而mid右边的数都比mid大所以只要找出k==mid的情况即可找到topK的数 时间复杂度:O(logn)* O(n) = O(nlogn) 其中O(n)是从头到尾遍历的复杂度,O(logn)是进行partition的复杂度 空间复杂度:O(n) 其中temp容器的空间复杂度是O(n) 注意:用这种方法是不能有重复数字的 //小的在左,大的在右, int partition_small ( vector < int > & a , int beg , int end ) { int i = beg , j = end ; int key = a [ i ] ; while ( i < j ) { while ( i < j && a [ j ] > key ) j -- ; //由于排序过程中不能有重复数字,所以a[i]>key是否取等也就无所谓了 if ( i < j ) a [ i ++ ] = a [ j ] ; else break ; while ( i < j && a [ i ] < key ) i ++ ; if ( i < j ) a [ j -- ] = a [ i ] ; else break ; } a [ i ]

快速排序

ε祈祈猫儿з 提交于 2020-02-03 04:03:11
快速排序采用了分而治之的策略(divide and conquer,D&C),一种著名的递归式问题解决方法。 分而治之的工作原理: 找出简单的基线条件 确定如何缩小问题的规模,使其符合基线条件 使用递归实现数组元素求和: java版本 public static int sum(int[] array){ if(array.length <= 1){ return array[0]; } return array[0] + sum(Arrays.copyOfRange(array,1,array.length)); } 编写涉及数组的递归函数时,基线条件通常是数组为空或只包含一个元素。 Python版本: def sum(list): if list==[]: return 0 return list[0]+sum(list[1:]) print (sum([1,2,3,4,5,6,7,8])) 使用递归计算列表包含的元素个数 java版本 public static int count(int[] array){ if(array.length < 1){ return 0; } return 1+count(Arrays.copyOfRange(array,1,array.length)); } Python版本 def count(list): if list == []:

算法之分治学习(快速排序)

馋奶兔 提交于 2020-02-02 03:07:30
整体思路 分支步骤:分解问题 (1)分解:将原问题分解成一系列子问题 (2)解决:递归地解各子问题。若子问题足够小,则直接有解; (3)合并:将子问题的结果合并成原问题的解 题目 1、快速排序 (1)题目 就是数组的快速排序啦 (2)代码 package com . lanqiao . vidio ; public class QuickSort { public static void main ( String [ ] args ) { int [ ] A = { 9 , 6 , 1 , 5 , 8 } ; sort ( A , 0 , A . length - 1 ) ; for ( int a : A ) { System . out . print ( a + " " ) ; } } public static void sort ( int [ ] A , int p , int r ) { if ( p < r ) { int q = partition ( A , p , r ) ; sort ( A , p , q - 1 ) ; sort ( A , q + 1 , r ) ; } } private static int partition ( int [ ] A , int p , int r ) { int pivot = A [ p ] ; int sp

快速排序算法python实现

£可爱£侵袭症+ 提交于 2020-02-02 02:04:37
快速排序 快速排序是一种递归调用的方法,思想是根据一个基准值,将数组比基准值小的放在左边,比基准值大的放在右边。运用了分而治之的思想,最后将三部份合并即可得到最终的有序数组 代码实现: def quickSort ( arr ) : if len ( arr ) < 2 : return arr leftarr = [ ] rightarr = [ ] item = arr [ 0 ] for i in range ( 1 , len ( arr ) ) : if arr [ i ] <= item : leftarr . append ( arr [ i ] ) else : rightarr . append ( arr [ i ] ) return quickSort ( leftarr ) + [ item ] + quickSort ( rightarr ) 代码验证: list_test = [ 3 , 5 , 10 , 2 , 1 , 7 , 6 , 8 ] print ( quickSort ( list_test ) ) list_test = [ 3 , 0 , 10 , - 1 , 1 , 7 , 6 , 100 , 20 , 31 ] print ( quickSort ( list_test ) ) 来源: CSDN 作者: Robot647 链接:

分治思想:快速排序

心已入冬 提交于 2020-02-02 01:51:59
快速排序思想: 设k=a[0](取基准元素),将k挪到适当位置,使得比k小的元素都在k左边,比k大的元素都在k的右边,和k相等的,在k的左右均可。然后再把k的左边的元素和右边的元素按照同样的方式进行排序。 时间复杂度:n*logn 空间复杂度:1 和归并排序比较,快速排序比归并排序更加节省空间,但是快速排序的稳定性要比归并排序差。 这里快排的代码没有对基准元素进行优化,属于最原始的快排代码。在快排的单数组比较的代码中,给了2种对比的方式。 代码: #include <iostream> using namespace std; void QuickSort(int arr[], int left, int right);//快排1 void QuickSort2(int arr[], int left, int right);//快排2 void swap(int& a, int& b); int main() { int arr[] = { 15,6,11,7,5,99,22,3,2,67,45,12,23,1,43,55,0,8,17,58 };//初始待排序数组 int size = sizeof(arr) / sizeof(int); int left = 0, right = size - 1; QuickSort(arr, left, right); for (int

【Python数据结构与算法笔记day29】6.4. 快速排序

混江龙づ霸主 提交于 2020-02-01 22:47:07
文章目录 6.4. 快速排序 快速排序 快速排序的分析 时间复杂度 快速排序演示 6.4. 快速排序 快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 步骤为: 从数列中挑出一个元素,称为"基准"(pivot), 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。 快速排序的分析 def quick_sort ( alist , start , end ) : """快速排序""" # 递归的退出条件 if start >= end : return # 设定起始元素为要寻找位置的基准元素 mid =

C++简单的快速排序

醉酒当歌 提交于 2020-02-01 22:00:10
C++简单的快速排序 代码描述 写一个快速排序将int型数组由小到大排序 我的代码 # include <iostream> //写一个快速排序 using namespace std ; void quicksort ( int * , int , int ) ; void swap ( int & , int & ) ; int main ( ) { cout << "Please enter a number:\n" << endl ; int n ; cin >> n ; cout << "Please enter " << n << " numbers" << endl ; const int n1 = n ; int a [ n1 ] ; for ( int i = 0 ; i < n1 ; i ++ ) { cin >> a [ i ] ; } //进行快速排序 quicksort ( a , 0 , n1 - 1 ) ; for ( int i = 0 ; i < n1 ; i ++ ) { cout << a [ i ] << " " ; } cout << endl ; return 0 ; } void quicksort ( int * a , int small , int big ) { int i = small , j = big ; if ( i

快速排序算法实现

此生再无相见时 提交于 2020-02-01 19:25:05
一般方法   快速排序每趟都可以确定一个元素的最终位置,使得其左侧元素均小于temp,右侧元素均大于temp。   快速排序的算法复杂度为 O ( n l o g n ) O(nlogn) O ( n l o g n ) ,当需要排序的序列接近有序时,算法复杂度退化为 O ( n 2 ) O(n^2) O ( n 2 ) 。 代码如下: //对区间[left, right]进行划分 int Partition ( int A [ ] , int left , int right ) { int temp = A [ left ] ; //将A[left]存放至临时变量temp while ( left < right ) { while ( left < right && A [ right ] > temp ) right -- ; //反复左移right A [ left ] = A [ right ] ; while ( left < right && A [ left ] <= temp ) left ++ ; //反复右移left A [ right ] = A [ left ] ; } A [ left ] = temp ; //放置temp至left与right相遇的地方 return left ; //返回相遇的下标 } //快速排序

快速排序 C语言 递归调用

[亡魂溺海] 提交于 2020-02-01 18:51:35
递归:要满足两个条件 1.循环部分,2.基准条件。 int partition( int a[], int left, int right ) a []是要从左到右排序的数组,其中left是第一个元素的索引,right是最后一个元素的索引。此函数确定数组中的枢轴,并将所有比pilov少的元素向左移动,而将所有所有元素向右移动。重新定位所有元素后,它将返回枢轴的索引。 其中先比较左边,中间,右边三数的大小关系,在将pivot和right-1两个位置进行交换,从而只需比较left-(righth-1)之间的数, while (1) { /*将序列中比基准小的移到基准左边,大的移到右边*/ while ( a[++Low] < Pivot ) ; while ( a[--High] > Pivot ) ; if ( Low < High ) { temp = a[Low]; a[Low] = a[High]; a[High] = temp; }//Swap( &A[Low], &A[High] ); else break; 这部分代码是关键,主要是实现让两数进行交换,当不满足条件时推出循环,最重要的是要实现返回递归可以实现下去的条件, //Swap( &A[Low], &A[Right-1] ); /* 将基准换到正确的位置 */ if(Low < right-1){ temp = a

蓝桥杯 算法提高 快速排序(注释详解)

大城市里の小女人 提交于 2020-02-01 17:02:36
算法提高 快速排序 打卡第四天o(  ̄▽ ̄ )ブ今天尝试了一下提高题,学习了快速排序的算法。 题目如下 : 问题描述   用 递归 来实现快速排序(quick sort)算法。快速排序算法的基本思路是:假设要对一个数组a进行排序,且a[0] = x。首先对数组中的元素进行调整,使x放在正确的位置上。同时,所有比x小的数都位于它的左边,所有比x大的数都位于它的右边。然后对于左、右两段区域,递归地调用快速排序算法来进行排序。   输入格式:输入只有一行,包括若干个整数(不超过10个),以0结尾。   输出格式:输出只有一行,即排序以后的结果(不包括末尾的0)。 输入输出样例 样例输入 5 2 6 1 7 3 4 0 样例输出 1 2 3 4 5 6 7 本来想用sort蒙混过关,但是觉得不太妥当,于是就去学习了 递归 (真的难)。 首先按题意理清思路,大致就是找一个 中间值 然后分别从左边和右边依次寻找小于和大于这个数的值的 下标 ,然后与中间值对换,如此往复使中间值摆到数组的最中间.然后递归调用这个函数, 分别把这一次设置的中间值左边一个数和右边一个数再设为中间值 。如此往复,达到了排序的效果。 老规矩,上代码: # include <iostream> using namespace std ; template < class T > void quicksort ( T * a