三九宝宝网宝宝百科宝宝知识

快速排序算法的排序演示

04月04日 编辑 39baobao.com

[数据结构教程第三十四课插入排序,快速排序]教学目的: 掌握排序的基本概念,插入排序、快速排序的算法教学重点: 插入排序、快速排序的算法教学难点: 快速排序算法授课内容:一、排序概述排序:将一个数据元素的无序序列重...+阅读

假设用户输入了如下数组: 下标 0 1 2 3 4 5 数据 6 2 7 3 8 9 创建变量i=0(指向第一个数据), j=5(指向最后一个数据), k=6(赋值为第一个数据的值)。

我们要把所有比k小的数移动到k的左面,所以我们可以开始寻找比6小的数,从j开始,从右往左找,不断递减变量j的值,我们找到第一个下标3的数据比6小,于是把数据3移到下标0的位置,把下标0的数据6移到下标3,完成第一次比较: 下标 0 1 2 34 5 数据 3 2 7 6 8 9 i=0 j=3 k=6

接着,开始第二次比较,这次要变成找比k大的了,而且要从前往后找了。递加变量i,发现下标2的数据是第一个比k大的,于是用下标2的数据7和j指向的下标3的数据的6做交换,数据状态变成下表: 下标 0 1 2 3 4 5 数据 3 2 6 7 8 9 i=2 j=3 k=6

称上面两次比较为一个循环。

接着,再递减变量j,不断重复进行上面的循环比较。

在本例中,我们进行一次循环,就发现i和j“碰头”了:他们都指向了下标2。于是,第一遍比较结束。得到结果如下,凡是k(=6)左边的数都比它小,凡是k右边的数都比它大: 下标 0 1 2 3 4 5 数据 3 2 6 7 8 9 如果i和j没有碰头的话,就递加i找大的,还没有,就再递减j找小的,如此反复,不断循环。注意判断和寻找是同时进行的。

然后,对k两边的数据,再分组分别进行上述的过程,直到不能再分组为止。

注意:第一遍快速排序不会直接得到最终结果,只会把比k大和比k小的数分到k的两边。为了得到最后结果,需要再次对下标2两边的数组分别执行此步骤,然后再分解数组,直到数组不能再分解为止(只有一个数据),才能得到正确结果。 在c++中可以用函数qsort()可以直接为数组进行排序。

用 法:

void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));

参数: 1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针,用于确定排序的顺序

请问Java快速排序法是怎么算的

* 步骤为: * 1. 从数列中挑出一个元素,称为 "基准"(pivot), * 2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,该基准是它的最后位置。这个称为分割(partition)操作。 * 3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 * 递回的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。 * param data 待排序的数组 * param low * param high * see SortTest#qsort(int[], int, int) * see SortTest#qsort_desc(int[], int, int) */ public void quickSort(int[] data, String sortType) { if (sortType.equals("asc")) { //正排序,从小排到大 qsort_asc(data, 0, data.length - 1); } else if (sortType.equals("desc")) { //倒排序,从大排到小 qsort_desc(data, 0, data.length - 1); } else { System.out.println("您输入的排序类型错误!"); } } /** * 快速排序的具体实现,排正序 * param data * param low * param high */ private void qsort_asc(int data[], int low, int high) { int i, j, x; if (low x) { j--; //从右向左找第一个小于x的数 } if (i x) { i++; //从左向右找第一个大于x的数 } if (i

关于快速排序

可以这样改,但是你的排序算法好算还是有点问题,自己再检查一下

#include #include using namespace std;

void quicksorb(vector &b) { vector::iterator it=b.begin()+b.size()/2; vector::iterator it1=b.begin(); vector::iterator it2=b.end(); int middle=*it; if(it==b.begin()+1) {swap(*b.begin(),*it);return;} else return;

int c=0; int d=0; for(;it1it;it2--) { if(*it1>*it&&*it2<*it) swap(*it1,*it2); if(*it1>*it) ++c; if(*it2<*it) ++d; }

if(c>d) { for(it1=b.begin();it1*it) {b.push_back(*it1);b.erase(it1);} } if(cit;it2--) if(*it2<*it) {b.insert(it,*it2);b.erase(it2);} } vector d1,d2; d1.assign(b.begin(),it); d2.assign(it,b.end()-1); quicksorb(d1); quicksorb(d2); }

int main() { int a,n=0; vectorb; //while(cin>>a) do{ cin>>a; if(a) b.push_back(a); }while(a); //b.push_back(a); // cout<<;"你已经输入了"<::iterator it=b.begin();it!=b.end();it++) cout<<*it<

快速排序怎么做

选择排序: 1:Program paixu; 2:var 3: a:array[1..20] of real; 4: temp:real; 5: i,j,k:integer; 6:begin 7: for i := 1 to 20 do 8: read(a[i]); 9: for i := 1 to 19 do 10: begin 11: k:=i; 12: for j:= i+1 to 20 do 13: if a[k]k then 16: begin 17: temp:=a[i]; 18: a[i]:=a[k]; 19: a[k]:=temp; 20: end 21: end; 22:for i := 1 to 20 do 23: write(a[i]); 24:readln 25:end. 冒泡排序: 1:Program paixu; 2:var 3: a:array[1..20] of real; 4: temp:real; 5: i,j:integer; 6: flag:boolean; 7:begin 8: for i := 1 to 20 do 9: read(a[i]); 10: i:=1; 11: repeat 12: flag:=true; 13: for j:= 1 to 20-i do 14: if a[j] 1:Program paixu; 2:const n=maxint; 3:var 4: a:array[1..n] of integer; 5: i:integer; 6:procedure sort(l,r: integer); 7: var 8: i,j,x,y: integer; 9: begin 10: i:=l;j:=r; 11: x:=a[(l+r) div 2]; 12: repeat 13: while a[i]j) then begin 16: y:=a[i]; 17: a[i]:=a[j]; 18: a[j]:=y; 19: inc(i);dec(j); 20: end; 21: until i>j; 22: if l27: read(a[i]; 28:sort(1,n); 29:readln 30:end. 谢谢支持...

以下为关联文档:

算法回顾之插入排序使用范围:小规模数据的排序的方案,而且是一种稳定的排序算法复杂度:O(n2) 思想: 首先我们来想一个问题,我们是否能找到一种方法,使一个数插入到一个有序的数组当中,并保证它依然有...

冒泡算法升序排序数组中随机生成的10个数public class MaoPiao { /** * 冒泡算法,升序排序数组中随机生成的10个数 */ public static void main(String[] args) { Random rd = new Random(); int a[] = new int[10];...

利用二叉排序排序本二叉树创建规则, 小于当前节点的数插入当前节点的左子树,大于当前节点的插入右子树,依次类推直到找到对应的节点。 打印62616964757a686964616fe58685e5aeb931333238653862的...

用程序流程图表示快速排序和冒泡排序什么意思?怎么写啊冒泡排序思想 :每次前后两个比较,前面大就交换这两个,一直到最后这是一趟,需要n趟(小到大排序) 例如:4 2 7 1 8 对这几个数冒泡排序 2 4 7 1 8 第一趟第一次交换2 4 2 4 7 1 8 第一...

Excel按时间排序排序直接进行排序就行了,不用担心前面的不会跟着变化,有对话框出来的话选择关联就行了 可以参考一下这个答案: 这个说明你要排序的区域内有合并的单元格,有合并的单元格是不能进行...

vb快速排序算法不明白原理求教悬赏100dim i as long,j as long,aa()as string,t as string '假设数据存放在一个未知长度的数组aa里面 for i=0 to ubound(aa) for j=0 to ubound(aa)-i if aa(j)>aa(j+1) then t=...

用VBS学习快速排序算法出现问题请指教!如下:快速排序法”使用的是递归原理,下面我结合一个例子来说明“快速排序法”的原理。首先给出一个数组{53,12,98,63,18,72,80,46, 32,21},先找到第一个数--53,把它作为中间值,也就是...

编写一个双向冒泡排序算法是什么编写一个双向冒泡排序算法是什么,C中冒泡排序算法思想:解:实现抄本袭题功能的算法如知下:道 void dbubblesort(sqlist r,int n) { int i,j,flag; flag=1; i=1; while(flag!=0)...

双向冒泡排序算法怎么写双向冒泡排序算法怎么写,c双向冒泡排序:void BubbleSort_(int a[],int n) { int tmp; int i=0; int j=0; for(;i+j<n;i++,j++) { for(int i_=0;i_<n-i-1;i_++) { if(a[i_]>a[i...

推荐阅读
图文推荐