交换排序
Posted carpeak
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了交换排序相关的知识,希望对你有一定的参考价值。
交换排序的基本思想是两两比较待排序元素的关键字,发现这两个元素的次序相反时即进行交换,直到没有反序的元素为止。本次介绍两种交换排序,即冒泡排序和快速排序。
1 冒泡排序
1. 1 算法步骤
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
实际上,一旦算法中的某一趟比较时不出现任何元素交换,说明已经排序好了,就可以结束本算法。
1 void BubbleSort(RecType arr[],int n)
2 { int i,j;
3 bool exchange;
4 for(i=0;i<n-1;i++)
5 {
6 exchange=false; //一趟前exchange置为false
7 for(j=n-1;j>i;j--)
8 {
9 if(arr[j]<arr[j-1])
10 {
11 swap(arr[j],arr[j-1]); //元素交换
12 exchange=true;
13 }
14 }
15 if(!exchange)//本趟没有发生交换,中途结束算法
16 return;
17 }
18 }
冒泡排序的平均时间复杂度为O(n2),是一种稳定的排序方法。
2 快速排序(递归的方式做)
快速排序(Quick Sort)使用分治法策略。
它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序流程:
(1) 从数列中挑出一个基准值。
(2) 将所有比基准值小的摆放在基准前面,所有比基准值大的摆在基准的后面(相同的数可以到任一边);在这个分区退出之后,该基准就处于数列的中间位置。
(3) 递归地把"基准值前面的子数列"和"基准值后面的子数列"进行排序。
1 int partition(RecType arr[],int s,int t)
2 { int i=s,j=t;
3 RecType tmp=arr[i]; //以arr[i]为基准
4 while(i<j) //从两端交替扫描,右边先开始。直到i=j 为止
5 { while(j>i && arr[j]>tmp) //从右向左扫描,找到一个小于tmp的
6 j--; //arr[j],找到的话,放入arr[i]处
7 a[i]=a[j];
8
9 while(i<j && tmp>=arr[i]) //从左向右扫描,找到一个大于tmp的
10 i++; //arr[i]。找到的话,放入arr[j]处
11 a[j]=a[i];
12
13 }
14 a[i]=tmp;
15 return i;
16 }
17
18 void QuickSort(RecType arr[],int s,int t) //对arr[s,t]的元素进行快速排序 增序
19 {
20 int i;
21 if(s<t)
22 { i=partition(arr,s,t);
23 QuickSort(arr,s,i-1);//对左区间递归排序
24 QuickSort(arr,i+1,t); //对右区间递归排序
25 }
26 }
快速排序的平均时间复杂度为O(nlog2n),是不稳定的排序方法
以上是关于交换排序的主要内容,如果未能解决你的问题,请参考以下文章
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段