欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

交换排序

程序员文章站 2023-11-10 15:50:16
交换排序的基本思想是两两比较待排序元素的关键字,发现这两个元素的次序相反时即进行交换,直到没有反序的元素为止。本次介绍两种交换排序,即冒泡排序和快速排序。 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),是不稳定的排序方法