常用排序算法
来源:互联网 发布: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
- 常用排序算法--冒泡排序
- 常用排序算法--插入排序
- 常用排序算法--希尔排序
- 常用排序算法--堆排序
- 常用排序算法--归并排序
- 常用排序算法--快速排序
- 常用排序算法--冒泡排序
- 常用排序算法--快速排序
- 常用排序算法-快速排序
- 常用排序算法-冒泡排序
- 常用排序算法-归并排序
- 常用排序算法-希尔排序
- 常用排序算法-冒泡排序
- C++常用排序算法
- C++常用排序算法
- 常用排序算法
- 常用排序算法
- 常用的排序算法
- oobe crash 分析
- Java开发中的23种设计模式详解(转)
- Javascript函数既可以实例化成对象也可以是可用的函数
- 生成照片宽高设置4:3
- 闭包的应用场景
- 常用排序算法
- POJ 1017 Packets(水~)
- Sudoku Solver填数
- 冒泡排序 回顾
- DB2中字符、数字和日期类型之间的转换
- javaScript里的setTimeout()函数
- Maven仓库—Nexus环境搭建及简单介绍
- Spring AOP 动态代理
- Java语言 快速排序