设为首页 加入收藏

TOP

交换排序
2019-10-09 19:57:17 】 浏览:33
Tags:交换 排序

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

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

 

 

 

 

 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++分治策略实现快速排序 下一篇长乐国庆集训Day1

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目