交换排序

  交换排序的基本思想是两两比较待排序元素的关键字,发现这两个元素的次序相反时即进行交换,直到没有反序的元素为止。本次介绍两种交换排序,即冒泡排序和快速排序

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),是不稳定的排序方法

 

 

 

 

 

posted @ 2019-10-01 19:46  peakcar  阅读(1120)  评论(0编辑  收藏  举报