快速排序

JS快速排序算法

爱⌒轻易说出口 提交于 2020-01-27 15:12:51
快速排序算法是基于递归思想所设计的算法,每次排序设定一个标准值,排序完成后,让标准值的前面都是比它小,后面都是比它大的,直到每组只剩一个数。 其流程基本如下: (1)首先设定一个分界值,通过该分界值将数组分成左右两部分。 (2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。 (3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。 (4)重复上述过程当左、右两个部分各数据排序完成后,整个数组的排序也就完成了 1 /********************************快速排序************************************************/ 2 3 function quickSort(arr) { 4 quickly(arr,0,arr.length - 1); //先追加几个参数 5 } 6 7 function quickly(arr,left,right) { 8 if (left >= right) { //做指针可能会比右指针大 9 return; //一旦相遇就递归终止 10 } 11 12 let

动画 | 什么是快速排序?

喜夏-厌秋 提交于 2020-01-27 15:05:37
快速排序属性 上一篇文章介绍了冒泡排序和它的优化。这次介绍的快速排序是冒泡排序演变而来的算法,比冒泡排序要高效的很多。 快速排序之所以快,是因为它使用了分治法。它虽然也是通过不断的比较和移动来实现排序的,只不过它的实现,增大了比较的距离和移动的距离。而冒泡排序只是相邻的比较和交换。 快速排序的思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。 从字面上感觉不到它的好处,我们通过一个示例来理解基本的快速排序算法,假设当前数组元素是:5, 1, 9, 3, 7, 4, 8, 6, 2。 基本的快速排序算法 初始状态:5, 1, 9, 3, 7, 4, 8, 6, 2 选择5作为一个基准元素,然后从右向左移动hight下标,进行基准元素和下标为hight 的元素进行比较。 如果基准元素要大,则进行hight的左移一位;如果基准元素要小,则进行元素的交换。 在hight下标左移的过程中,我们目的是找出比基准元素小的,然后进行交换。 交换完之后,进行left的右移,找出比基准元素大的,找到则进行交换。 视频动画 算法动画视频 地址 Code Result 发生交换 [2, 1, 9, 3, 7, 4, 8, 6, 5]发生交换 [2, 1, 5, 3, 7, 4, 8, 6, 9

算法基础——快速排序

爷,独闯天下 提交于 2020-01-27 00:28:20
1. 思想 分治法 选择分界点(arr[l]、arr[mid]、arr[r]) 调整数组区间(左半部分 < 分界点,右半部分 > 分界点) 递归处理左半部分,递归处理右半部分 2. 模版 # include <iostream> # include <algorithm> using namespace std ; const int N = 1e6 + 10 ; int arr [ N ] ; void quickSort ( int * arr , int l , int r ) { if ( l >= r ) return ; int i = l - 1 , j = r + 1 , x = arr [ ( l + r ) >> 1 ] ; //1. 选择分界点 while ( i < j ) //2. 调整数组区间 { do ++ i ; while ( arr [ i ] < x ) ; do -- j ; while ( arr [ j ] > x ) ; if ( i < j ) swap ( arr [ i ] , arr [ j ] ) ; } quickSort ( arr , l , j ) ; //3. 递归处理 quickSort ( arr , j + 1 , r ) ; } int main ( ) { int n ; scanf ( "%d" , &

C++排序算法之快速排序

时光总嘲笑我的痴心妄想 提交于 2020-01-26 20:01:10
思路 如下图所示,对于数组s={11,18,20,11,6,8},选择11作为关键字key,然后选择两个哨兵low和high分别从数组的首部和尾部出发,执行以下操作: 循环判断尾部哨兵所在元素是否大于key,且low<high,若是则哨兵high–,循环继续;否则循环停止,执行s[low]=s[high],然后转到2。 循环判断首部哨兵所在元素是否小于或等于key,且low<high,若是则哨兵low++,循环继续;否则循环停止,执行s[high]=s[low],然后转到3。 若low>=high,循环停止,否则转到1。 C++实现 int partion ( vector < int > & s , int low , int high ) { int key = s [ low ] ; while ( low < high ) { while ( low < high && s [ high ] > key ) high -- ; s [ low ] = s [ high ] ; while ( low < high && s [ low ] <= key ) low ++ ; s [ high ] = s [ low ] ; } s [ low ] = key ; return low ; } void quickSort ( vector < int > & s , int

_数据结构_快速排序

旧时模样 提交于 2020-01-26 14:36:02
快速排序是一种二叉树结构的交换排序算法     其基本思想是在序列中找一个元素作为基准值,将排序集合分割为两个子序列,左子序列中的所有元素都小于基准值,右子序列中的所有元素均大于基准值,再将左右子树重复此操作,知道所有元素都排列在相应位置 源代码获取: https://github.com/akh5/C-/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/%E6%8E%92%E5%BA%8F/quicksort.c 讨论前后指针法 序列中分别在前后定义两个指针,将一开始开头指针指向的值作为基准值,后指针开始向前遍历,遍历到比基准值小的值时,当前位置的值与基准值交换,前指针开始向后遍历,遇到比基准值大的值时,当前位置与基准值交换,,换前指针向前遍历,反复交替,直到前指针与后指针交叉。 此时将序列分为左右两个子树,基准值为根,左子树均小于基准值,右子树均大于基准值 # include <stdio.h> void Swap ( int * a , int * b ) //交换的函数 { int temp ; temp = * a ; * a = * b ; * b = temp ; } void dealsort ( int * arr , int start , int end ) { if ( start >= end ) {

快速排序

三世轮回 提交于 2020-01-25 19:20:58
基本思想:给定一个数组a,以a[low]为基准,赋值给X保存,X = a[low](相当于把a[low]的位置腾空了,挖出一个坑),从数组的两边开始查找比较 1.(先从high开始,找到第一个小于基准的元素,然后和a[low]交换位置,即填入a[low]腾出的坑中); 2.再从数组的low位置开始比较,找到第一个大于a[low]的数,填入最新的腾出的坑中(也就是上一步中,满足条件的a[high]的位置) 完成第1步和第2步后,就基准元素就找到了它最终所在的位置;对基准元素左右两边的区间分别再执行上面的两个步骤,最后所得的数组,就是有序的数组。 //快速排序 void quick_sort(int s[], int l, int r) { if (l < r) { //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1 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

[算法]——归并排序(Merge Sort)

那年仲夏 提交于 2020-01-24 02:36:47
归并排序 (Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序;然后将已经有序的两个子部分进行合并,最终完成排序。其时间复杂度与快速排序均为O(nlogn),但是归并排序除了递归调用间接使用了辅助空间栈,还需要额外的O(n)空间进行临时存储。从此角度归并排序略逊于快速排序,但是归并排序是一种稳定的排序算法,快速排序则不然。 所谓 稳定排序 ,表示对于具有相同值的多个元素,其间的先后顺序保持不变。对于基本数据类型而言,一个排序算法是否稳定,影响很小,但是对于结构体数组,稳定排序就十分重要。例如对于student结构体按照关键字score进行非降序排序: // A structure data definition typedef struct __Student { char name[16]; int score; }Student; // Array of students name : A B C D score: 80 70 75 70 Stable sort in ascending order: name : B D C A score: 70 70 75 80 Unstable sort in ascending order: name : D B C A score: 70 70 75 80

冒泡排序与快速排序比较

此生再无相见时 提交于 2020-01-23 23:14:16
1.简单描述冒泡排序 1.1什么是冒泡排序? 冒泡排序是一种简单的排序方法,它的基本思想是:通过相邻两个元素之间的比较和交换,使较大的元素逐渐从前面移向后面(升序),就像水底下的气泡一样逐渐向上冒泡,所以被称为“冒泡”排序。 1.2逻辑图表示 1.3算法逻辑实现 2.简单描述快速排序 2.1什么是快速排序? 快速排序(Quick Sort) 是对冒泡排序的一种改进方法,在冒泡排序中,进行元素的比较和交换是在相邻元素之间进行的,元素每次交换只能移动一个位置,所以比较次数和移动次数较多,效率相对较低。而在快速排序中,元素的比较和交换是从两端向中间进行的,较大的元素一轮就能够交换到后面的位置,而较小的元素一轮就能交换到前面的位置,元素每次移动的距离较远,所以比较次数和移动次数较少,速度较快,故称为“快速排序”。 2.2快速排序实现过程 2.3代码实现 来源: CSDN 作者: 迷茫小胖子 链接: https://blog.csdn.net/weixin_46102896/article/details/103785101

对象数组和数值数组快速排序

ε祈祈猫儿з 提交于 2020-01-23 02:36:44
默认asc正序,desc倒序。 主要代码: function SortObjectQuick(sourceObjArr,keyObj,sortType="asc"){ try{ for(let i=0,length=sourceObjArr.length;i<length;i++){ if(Object.isSealed(sourceObjArr[i])&&typeof sourceObjArr[i]==Object){ throw new Error("Error!The object have been sealed.Arr index:"+i+"!") } if(Object.isFrozen(sourceObjArr[i])&&typeof sourceObjArr[i]==Object){ throw new error("Error!The object have been Freeze.Arr index:"+i+"!") } /* if(Object.isExtensible(sourceObjArr[i])){ throw new error("Error!The object have been PreventExtensions.Arr index:"+i+"!") } */ } return sortQuick(sourceObjArr,keyObj

递归和快速排序

感情迁移 提交于 2020-01-22 05:48:59
文章目录 递归 问题描述 基线条件和递归条件 栈 调用栈 递归调用栈 小结 快速排序 示例1 问题描述 欧几里得算法 使用D&C解决问题的两个步骤: 示例2 快速排序 工作原理 代码 小结 递归 问题描述 假设你在祖母的阁楼中翻箱倒柜,发现了一个上锁的神秘手提箱。祖母告诉你,钥匙很可能在下面这个盒子里,这个盒子里有盒子,而盒子里的盒子又有盒子。钥匙就在某个盒子中。为找到钥匙,你将使用什么算法? 方法一: 创建一个要查找的盒子堆。 从盒子堆取出一个盒子,在里面找。 如果找到的是盒子,就将其加入盒子堆中,以便以后再查找。 如果找到钥匙,则大功告成! 回到第二步。 方法二: 检查盒子中的每样东西。 如果是盒子,就回到第一步。 如果是钥匙,就大功告成! 第一种方法使用的是while循环:只要盒子堆不空,就从中取一个盒子,并在其中仔细查找。 def look_for_key ( main_box ) : pile = main_box . make_a_pile_to_look_through ( ) while pile is not empty : box = pile . grab_a_box ( ) for item in box : if item . is_a_box ( ) : pile . append ( item ) elif item . is_a_key ( ) :