交换排序

来源:互联网 发布:黄渤的唱功 知乎 编辑:程序博客网 时间:2024/04/30 08:18

  交换排序的基本方法是:两两比较待排序的关键字,并交换不满足次序要求的那些偶对,直到全部满足为止。这里介绍冒泡排序和快速排序两种交换排序方法。

冒泡排序

1.算法思想
  通过无序区中相邻关键字间的比较和位置交换,使关键字最小的元素如气泡一般逐渐网上“漂浮”直至“水面”。
  整个算法是从最下面的元素开始,对每两个相邻元素的关键字进行比较,且使关键字较小的元素换至关键字较大的元素之上,使得经过一趟冒泡排序后,关键字最小的元素到达最上端。接着,再从剩下的元素中找关键字次小的元素,并把它欢在第二个位置上。依次类推,一直到所有元素都有序为止。

2.性能分析
  当初始序列正序时,执行效率最高,此时时间复杂度为O(n);当初始序列反序时,执行效率最低,此时时间复杂度为O(n2)。所以当初始数据序列越接近正序,冒泡排序算法的性能越好。

这里写图片描述

快速排序

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;}

运行结果如下:

这里写图片描述

0 0
原创粉丝点击