连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort)
连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort)
1,起泡排序(bubble sort),大致有三种算法
- 基本版,全扫描。
- 提前终止版,如果发现前区里没有发生交换,就说明前区已经有序了,直接终止了。但是有个效率低下的地方,就是右边界hi是每次循环向前移动一个单元
- 跳跃版,在提前终止版的基础上,解决右边界hi移动效率低下的问题。解决思路:每次循环后,记录下最后一次的交换位置A,然后让hi=交换位置A,所以hi就可以跳跃移动多个单元了。
基本版代码实现
//冒泡排序(基本版 效率低下)
template<typename T>
void Vector<T>::bubbleSortA(Rank lo, Rank hi){
while(lo < hi - 1){
for(int i = lo; i < hi - 1; ++i){
if(_elem[i] > _elem[i+1]){
std::swap(_elem[i], _elem[i+1]);
}
}
hi--;//头不变,不断收缩尾部
}
}
提前终止版代码实现
//冒泡排序(提前终止版 效率比基础版高)
template<typename T>
void Vector<T>::bubbleSortB(Rank lo, Rank hi){
while(!bubbleB(lo, hi--));
}
template<typename T>
bool Vector<T>::bubbleB(Rank lo, Rank hi){
bool sorted = true;//假设整体有序
for(int i = lo; i < hi - 1; ++i){
if(_elem[i] > _elem[i+1]){
sorted = false;
std::swap(_elem[i], _elem[i+1]);
}
}
return sorted;
}
跳跃版代码实现
//冒泡排序(跳跃版,跳跃移动边界hi 效率最高)
template<typename T>
void Vector<T>::bubbleSortC(Rank lo, Rank hi){
do{
hi = bubbleC(lo, hi);
}while(lo < hi);
}
template<typename T>
Rank Vector<T>::bubbleC(Rank lo, Rank hi){
Rank last = lo;
for(int i = lo; i < hi - 1; ++i){
if(_elem[i] > _elem[i+1]){
last = i + 1;
std::swap(_elem[i], _elem[i+1]);
}
}
return last;
}
2,归并排序(merge sort)
利用递归里的减而知之的策略。把数组分为两段,然后分别排序,最后合并在一起。
template <typename T> //向量归并排序
void Vector<T>::mergeSort ( Rank lo, Rank hi ) { //0 <= lo < hi <= size
if ( hi - lo < 2 ) return; //单元素区间自然有序,否则...
int mi = ( lo + hi ) / 2; //以中点为界
mergeSort ( lo, mi ); //分别排序
mergeSort ( mi, hi ); //分别排序
merge ( lo, mi, hi ); //归并
}
template <typename T> //有序向量(区间)的归并
void Vector<T>::merge ( Rank lo, Rank mi, Rank hi ){ //各自有序的子向量[lo, mi)和[mi, hi)
T* A = _elem + lo; //合并后的向量A[0, hi - lo) = _elem[lo, hi)
int lb = mi - lo; T* B = new T[lb]; //前子向量B[0, lb) = _elem[lo, mi)
for ( Rank i = 0; i < lb; i++ ) B[i] = A[i]; //复制前子向量
int lc = hi - mi; T* C = _elem + mi; //后子向量C[0, lc) = _elem[mi, hi)
for ( Rank i = 0, j = 0, k = 0; j < lb; ) //归并:反复从B和C首元素中取出更小者
A[i++] = ( lc <= k || B[j] <= C[k] ) ? B[j++] : C[k++]; //将其归入A中
delete [] B; //释放临时空间B
}
3,两种排序算法的比较
归并排序的效率高
c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854
连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort)的更多相关文章
- 经典排序算法 - 归并排序Merge sort
经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...
- 排序算法二:归并排序(Merge sort)
归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 private void merge_sort(int[] array, int ...
- 归并排序(merge sort)
M erge sort is based on the divide-and-conquer paradigm. Its worst-case running time has a lower ord ...
- Insertion Sort and Merge Sort
Insertion Sort(插入排序) 思路:for 循环遍历数组中的每一个数 用while将每次遍历到的数于左侧的数进行对比,将小的排到左边 void InsertionSort(int*A, i ...
- 【Sort】Merge Sort归并排序
归并排序运行时间O(N log N),但是由于需要线性附加内存,所以很少用于主存排序. 算法核心在于以下三条语句,分治递归,分别对左半边和右半边的数组进行排序,然后把左右半边的数组一一进行比较放入数组 ...
- 归并排序——Merge Sort
基本思想:参考 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法的一个非常典型的应用.首先考虑下如何将2个有序数列合并.这个非常简单,只要从比较2个数列的第一个数,谁小就先取谁,取了 ...
- 归并排序Merge sort(转)
原理,把原始数组分成若干子数组,对每一个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组 举例 无序数组[6 2 4 1 5 9] 先看一下每个步骤下的状态, ...
- 归并排序Merge Sort
//C语言实现 void mergeSort(int array[],int first, int last) { if (first < last)//拆分数列中元素只剩下两个的时候,不再拆分 ...
- Insertion Sort 与 Merge Sort的性能比较(Java)
public static void main(String[] args) { Scanner input = new Scanner(System.in); int n = input.nextI ...
随机推荐
- [Go] go中的goto语句跳到指定标签
比如下面的语句goto TOP ,其中TOP就是自己的自定义的标签,下面的TOP:就是要执行的代码段一般用在需要两层循环的地方,里面goto再跳回上面去 ; i < ; i++ { { goto ...
- 8.1 Spark MLlib简介
一.什么是机器学习 机器学习可以看做是一门人工智能的科学,该领域的主要研究对象是人工智能.机器学习利用数据或以往的经验,以此优化计算机程序的性能标准. 机器学习强调三个关键词:算法.经验.性能 二.基 ...
- 纯CSS实现自动轮播,CSS变量的定义与使用,计算属性的使用
先来看一下实现的效果: 实现原理: HTML中使用ul>li存放图片 CSS使用CSS3的animation来完成动画 <!-- HTML --> <section class ...
- txt换行追加写入
with open(negative_txt, 'a') as f: patch_name1 = patch_name + '\n' f.write(patch_name1)
- react+dva 全局model中异步获取数据state在组件中取不到值
先上结论,不是取不到,是写法有问题. 全文分4部分,1是问题描述,2是一开始的解决想法(错误做法),3是问题产生原因的思考,4是正常解决方法.只想看结论直接跳4 1.问题描述 接触react dva一 ...
- prerender-spa-plugin预渲染踩坑
为什么要使用预渲染? 为了应付SEO(国内特别是百度)考虑在网站(vue技术栈系列)做一些优化.大概有几种方案可以考虑: 服务端做优化: 第一,ssr,vue官方文档给出的服务器渲染方案,这是一套完整 ...
- IDEA debug工具使用
参考:https://www.cnblogs.com/jajian/p/9410844.html
- iOS: 创建静态库,实现自己的API私有使用
一.介绍 在开发中经常使用到第三方的静态框架,格式基本上就是.framework和.a格式的.使用时,会发现我们只能使用无法修改,这就是静态框架的一个好处,私有性.内部实现的代码只有公开者本人知晓,对 ...
- 用 Python 批量下载百度图片
为了做一个图像分类的小项目,需要制作自己的数据集.要想制作数据集,就得从网上下载大量的图片,再统一处理. 这时,一张张的保存下载,就显得很繁琐.那么,有没有一种方法可以把搜索到的图片直接下载到本地 ...
- 【STM32H7教程】第27章 STM32H7的TCM,SRAM等五块内存的动态内存分配实现
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第27章 STM32H7的TCM,SRAM等五块内 ...