常用排序算法

来源:互联网 发布:pp助手mac版工具箱 编辑:程序博客网 时间:2024/06/02 16:12

一、冒泡排序算法

算法思想:交换排序思想,即两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
算法平均时间复杂度:O(n^2)

1、 传统冒泡排序算法

void bubble_sort (int R[],int n){    //n ,lenth of the array    //R(0..n-1)是待排序的数组,采用自下向上扫描,对R做冒泡排序    int tmp;    bool exchange = false; //交换标志    for(int i = 0;i < n;i++){ //最多做n-1趟排序        exchange = false; //本趟排序开始前,交换标志应为假        for(int j= n-1;j>i;j--) //对当前无序区R[i..n]自下向上扫描            if(R[j]<R[j-1]){//交换记录                tmp=R[j];//R[0]不是哨兵,仅做暂存单元                R[j]=R[j-1];                R[j-1]=tmp;                exchange = true; //发生了交换,故将交换标志置为真            }        if(!exchange) //本趟排序未发生交换,提前终止算法            return;}

2、优化的冒泡排序法

 void OPtimizedBubbleSort(int R[],int n){    //R(0..n-1)是待排序的数组,采用自下向上和自上向下双向扫描,对R做冒泡排序    int tmp;    int high = n-1;    int low = 0;    bool exchange = false; //交换标志    while (low < high) { //最多做n/2趟排序        exchange = false; //本趟排序开始前,交换标志应为假        for (int i = low; i < high ; i++) {//对当前无序区R[low..high]自上向下扫描            if (R[i] > R[i+1] ) {//交换记录                tmp = R[i];                R[i] = R[i+1];                R[i+1] = tmp;                exchange = true; //发生了交换,故将交换标志置为真            }        }        high --;        for (int j = high; j > low ; j--) {//对当前无序区R[low..high]自下向上扫描            if (R[j] < R [j-1]) {//交换记录                tmp = R[j];                R[j] = R[j-1];                R[j-1] = tmp;                exchange = true; //发生了交换,故将交换标志置为真            }        }        low ++;        if(!exchange) //本趟排序未发生交换,提前终止算法            return;        print(R,8,i);    }}

二、 快速排序

算法思想:分治法的基本思想,即将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。

算法时间复杂度:在平均状况下,排序n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 演算法更快。

算法:

void QuickSort(int R[],int low,int high) { //对R[low..high]快速排序    int pivotpos; //划分后的基准记录的位置    if(low<high){//仅当区间长度大于1时才须排序        pivotpos=Partition(R,low,high);//对R[low..high]做划分        QuickSort(R,low,pivotpos-1); //对左区间递归排序        QuickSort(R,pivotpos+1,high); //对右区间递归排序    } } //QuickSortint Partition(int R[],int i,int j) {    //调用Partition(R,low,high)时,对R[low..high]做划分,    //并返回基准记录的位置    int pivot=R[i]; //用区间的第1个记录作为基准    while(i<j){ //从区间两端交替向中间扫描,直至i=j为止        while(i<j&&R[j]>=pivot) //pivot相当于在位置i上            j--; //从右向左扫描,查找第1个关键字小于pivot.key的记录R[j]            if(i<j) //表示找到的R[j]的关键字<pivot                R[i++]=R[j]; //相当于交换R[i]和R[j],交换后i指针加1                while(i<j&&R[i]<=pivot) //pivot相当于在位置j上                    i++; //从左向右扫描,查找第1个关键字大于pivot的记录R[i]                    if(i<j) //表示找到了R[i],使R[i]>pivot                        R[j--]=R[i]; //相当于交换R[i]和R[j],交换后j指针减1    }//endwhile    R[i]=pivot; //基准记录已被最后定位    return i; }

参考网站:(http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.1.1.1.htm)

0 0
原创粉丝点击