交换排序
程序员文章站
2022-06-07 14:19:24
交换排序的基本思想是两两比较待排序元素的关键字,发现这两个元素的次序相反时即进行交换,直到没有反序的元素为止。本次介绍两种交换排序,即冒泡排序和快速排序。 1 冒泡排序 1. 1 算法步骤 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后 ......
交换排序的基本思想是两两比较待排序元素的关键字,发现这两个元素的次序相反时即进行交换,直到没有反序的元素为止。本次介绍两种交换排序,即冒泡排序和快速排序。
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),是不稳定的排序方法