快速排序的四种python实现,python顺序排列函数
模板函数sort() sort是一个模板函数:sort(),它可以接受括号中的两个或三个参数。先说两个参数,因为三个参数还没研究呢,哈哈。
使用sort()时,需要添加头文件算法,英文意思是“算法”。
接受两个参数时,默认的排序方式是升序,添加第三个参数实现降序。第一个参数是要排序的序列的第一个地址,第二个参数是序列的最后一个数字加1的地址。比如对数组a[7]={5,7,9,10,8,2,3}进行排序,就是sort(a,a 7)。
# includeiostream # includealgorithmusing命名空间stdint main() {int a[10]={9,6,3,8,5,2,7,4,1,0 };for(int I=0;i10I)couta[I]“”;coutendl排序(a,a 10);#注意这是一个10 for(int I=0;i10I)couta[I]“”;返回0;}运行结果:9 6 3 8 5 2 7 4 1 00 1 2 3 4 5 6 7 8 9桶排序法这种桶排序法以前没听说过。看图:(其实我看表)
0000000000.a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a.]
这是一个初始化为零的序列。如果你想用它来排序,比如这样一组数字:6,3,9,6,8,7,5,4。
首先,根据下标赋值,即:
0001112111.a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a.]
实际上,它是按照下标的顺序排列的。按照里面的值输出就行了。
# includeiostream # includealgorithmusing命名空间stdint main() {int x,n;cinnint a[100]={ 0 };for(int I=0;在;I){ cinx;a[x];} for(int I=0;i100I){ for(int m=1;m=a[I];m){ couti“”;}}}其实桶排序并不是将这些数字在数组内部按升序排列,只是借助下标输出。
冒泡排序。这个排序方法老师在课堂上讨论过。主要原理是冒泡,哈哈哈。气泡可以按升序或降序排列,例如一列数字:2 3 6 8 10 5 1七个数字。
按升序排列,第一个周期:比较两个相邻的数,较大的数放在后面,这样第一个周期比较6次:2 3 6 8 5 1 10。
可以看到第一个周期最大值10浮出水面。因此可以推断,为了完成排序,最多需要n-1个周期。而且每个周期比较的次数是逐渐减少的,因为有些值已经按顺序排列了。
# includeiostreamusing命名空间stdint main() {int n,exchangeCout 您想排列多少个数字:;cinnint a[100];for(int I=0;在;I){ Cina[I];} for(int I=1;I=n-1;I) #主算法{ for(int j=1;j=n-I;j){ if(a[j-1]a[j]){ exchange=a[j-1];a[j-1]=a[j];a[j]=交易所;} } } for(int I=0;在;I){ couta[I] ;}}}选择排序或2 3 6 8 10 5 1这七个数,按升序排列。这一次,不再是冒泡,而是选择。
具体思路:也需要6个周期。在第一个循环中,将2与后面的六个数进行比较,选择最小的一个,即1,放在第一个位置;下一次,从第二个数字开始,与后五个数字进行比较,然后将第二小的数字即2放在第二个位置;依此类推,直到该行结束。
# includeiostreamusing命名空间stdint main() {int n,exchangeCout 您想排列多少个数字:;cinnint a[100];for(int I=0;在;I){ Cina[I];} for(int I=0;I=n;I){ for(int j=I 1;j=n-1;j){ if(a[I]a[j]){ exchange=a[I];a[I]=a[j];a[j]=交易所;} } } for(int I=0;在;I){ couta[I] ;}}快速排序快速排序可以说是比以上几种更难理解的一种排序方法。但其效率高,思维方式巧妙,需要二分法和递归。
这里参考阿哈雷的文章,还是想用自己的语言总结一下快速排序算法,哈哈。
先看6 1 2 7 9 3 4 5 10 8之前这样一个未排序的序列,再看它的变形:3 1 2 5 4 6 9 7 10 8。
发现这十个数以6为基数分为两个阵营:左边小于6,右边大于6。在这里,6被称为基准数,它将发挥重要作用。
快速排序就是这样一个用基准数不断划分阵营的过程。我们先来看看以上两个系列是如何转化的:
(图片来自Ahalei博客,侵删。)
我们先选择6作为参考数,定义两个士兵(变量)I和j,初始值分别是1和10,也就是在数列的左右两边。
接下来,两个士兵被分配了不同的任务:士兵J先开始,到左边的J-。他的任务是找到一个比基准数6小的数,当他达到5时就停止了;
单衣然后出发,往右边走。它的任务是找到一个大于基准数6的数,当它达到7时就停止了。如图所示:
接下来就是交换,交换士兵脚下的价值。这里,第一次交流结束了。
然后,士兵J继续出发,执行之前的任务。这一次,它停在这里4;单衣也开始了,9点停在这里;还是那句话,还是要换的。交换后,如图所示:
然后J继续寻找一个小于6的数,它找到了3,于是停止了;然后我出发了,但是我3点在这里遇到了J;他们的任务还没有结束,还需要用基准数6来交换脚下的价值。
至此,任务完成。这组数字变成这样:3 1 2 5 4 6 9 7 10 8,以6为基准站在两边。
所以,做到上面的方法,掌握下面的,并不难。即利用递归在两边的两组数中寻找参考数。例如:左边的3 1 2 5 4,
以3为这组数字的参考数,按照上面的方法,如果正确,一波操作应该变成2 1 3 5 4。
接下来,需要处理左边的序列2 1和右边的序列5 4。序列2 ^ 1以2为参考数进行调整,处理后的序列为“1 ^ 2”,所以已经返回2。序列“1”只有一个数,不需要任何处理。到目前为止,我们都处理了序列“2 1”,得到了序列“1 2”。序列“5 4”的处理也用这种方法建模。
最终可以得到1 2 3 4 5 6 7 8 9 10。
所以在整个过程中,基准数是不断变化的,团队也是不断变化的。
解释一下上面过程中的一些细节:
基准号的选择;士兵出发的顺序;附上以下代码:
# includeiostreamusing命名空间stdint a[100],n;void quicksort(int left,int right) {int i,j,t,tempif(leftright)返回;temp=a[left];I=左;j=右;而(我!=j){ while(a[j]=tempji)j-;while(a[I]=tempji)I;if(ij){ t=a[I];a[I]=a[j];a[j]=t;} } a[left]=a[I];a[I]=temp;快速排序(左,I-1);快速排序(i 1,右);}int main() {cout 排几号:;cinnfor(int I=0;在;I){ Cina[I];}quicksort(0,n-1);for(int I=0;在;I){ couta[I] ;}}
除此之外,还有其他快速排序的思路。贴个地址:挖个坑,填上数字,分而治之。这个想法也很好。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。