交换排序
来源:互联网 发布:黄渤的唱功 知乎 编辑:程序博客网 时间:2024/04/30 08:18
交换排序的基本方法是:两两比较待排序的关键字,并交换不满足次序要求的那些偶对,直到全部满足为止。这里介绍冒泡排序和快速排序两种交换排序方法。
冒泡排序
1.算法思想
通过无序区中相邻关键字间的比较和位置交换,使关键字最小的元素如气泡一般逐渐网上“漂浮”直至“水面”。
整个算法是从最下面的元素开始,对每两个相邻元素的关键字进行比较,且使关键字较小的元素换至关键字较大的元素之上,使得经过一趟冒泡排序后,关键字最小的元素到达最上端。接着,再从剩下的元素中找关键字次小的元素,并把它欢在第二个位置上。依次类推,一直到所有元素都有序为止。
2.性能分析
当初始序列正序时,执行效率最高,此时时间复杂度为O(n);当初始序列反序时,执行效率最低,此时时间复杂度为O(
快速排序
1.算法思想
在待排序的n个元素中任取一个元素(通常为第一个元素),把该元素放入最终的位置后,整个数据区间被分为两个子区间:所有关键字比该元素小的放置在前子区间,所有关键字比该元素大的放置在后子区间,并把该元素放在这两个子区间的中间,这个过程称作一趟快速排序。然后对两个子区间递归进行快速排序,直至每个子区间只有一个元素为止。
2.算法过程
一趟快速排序采用从两头向中间扫描的办法,同时交换与基准元素逆序的元素。具体做法是:设置两个指示器i和j,它们的初值分别为无序区间中的第一个和最后一个元素。
//temp存储无序区第一个元素 temp = a[low];//从区间两端交替向中间扫描,直至low=high while(low!=high) { //从右往左扫描,找到第一个关键字小于temp的下标 while(high>low && a[high]>temp) --high; //a[high]移到a[low]处,将小于temp的数前移 a[low] = a[high]; //从左往右扫描,找到第一个管子件大于temp的下标 while(low<high && a[low]<temp) ++low; //a[low]移到a[high]处,将大于temp的数后移 a[high] = a[low];}//将temp归位 a[low] = temp;
3.性能分析
当数据有序时,以第一个关键字为基准分为两个子序列,前一个子序列为空,此时执行效率最低。反之,当数据随机分布时,以第一个关键字为基准分为两个子序列,两个子序列的元素个数接近相等,此时的执行效率最高。所以当数据越随机分布时,快速排序算法的性能越好,当数据越接近有序时,快速排序算法的性能越差。
完整测试代码
#include<iostream>using namespace std;//冒泡排序 void bubble_sort(int a[], int n) { //设置exchange值,当一趟排序中没有交换数据时, //说明已经有序,退出程序 int exchange = 0,temp =0; for(int i=0;i<n-1;++i) { exchange = 0; for(int j=n-1;j>i;--j) { if(a[j]<a[j-1]) { temp = a[j]; a[j] = a[j-1]; a[j-1] = temp; exchange = 1; } } if(exchange = 0) return; }}//快速排序 void quick_sort(int a[], int l,int r) { int low=l,high=r; int temp = 0; //区间至少存在一个元素 if(l<r) { //temp存储无序区第一个元素 temp = a[low]; //从区间两端交替向中间扫描,直至low=high while(low!=high) { //从右往左扫描,找到第一个关键字小于temp的下标 while(high>low && a[high]>temp) --high; //a[high]移到a[low]处,将小于temp的数前移 a[low] = a[high]; //从左往右扫描,找到第一个管子件大于temp的下标 while(low<high && a[low]<temp) ++low; //a[low]移到a[high]处,将大于temp的数后移 a[high] = a[low]; } //将temp归位 a[low] = temp; //递归排序左右无序区间 quick_sort(a,l,low-1); quick_sort(a,low+1,r); }}//输出数组void print_array(int a[],int n) { for(int i=0;i<n;++i){ cout<<a[i]<<" "; } cout<<endl;} //测试代码 int main() { cout<<"Test exchange_sort:"<<endl; cout<<endl; //冒泡排序测试数据 int a[] = {4,10,6,2,11,9,7}; int n = 7; cout<<"Before sort:"; print_array(a,n); cout<<"After bubble_sort:"; bubble_sort(a,n); print_array(a,n); cout<<endl; //快速排序测试数据 int a1[] = {12,5,15,2,1,9,7,11}; int n1 = 8; cout<<"Before sort:"; print_array(a1,n1); cout<<"After quick_sort:"; quick_sort(a1,0,n1-1); print_array(a1,n1); cout<<endl; return 0;}
运行结果如下:
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- 交换排序
- Longest Palindromic Substring
- Spring MVC的HTTP请求信息转换器HttpMessageConverter
- iOS自定义控件-动态标签展示
- jquery数字滚动
- COM简介
- 交换排序
- Docker应用的监控
- Java数组取交集
- android通过电源管理保持屏幕常亮
- JS判断数据类型
- iOS开发 - MKNetworkKit的使用 上传下载
- 几种ios界面间的传值方式
- PB数据窗口难得一见的技巧
- linux 下的链接文件详解