数据结构:排序算法之交换排序(冒泡排序、快速排序)
1、冒泡
void bubbleSort(int a[], int n){for(int i =0 ; i< n-1; ++i) {for(int j = 0; j < n-i-1; ++j) {if(a[j] > a[j+1]){int tmp = a[j] ; a[j] = a[j+1] ; a[j+1] = tmp;}}}
}/*1.设置一标志性变量pos,用于记录每趟排序中最后一次进行交换的位置。由于pos位置之后的记录均已交换到位,故在进行下一趟排序时只要扫描到pos位置即可。
改进后算法如下:
*/
void Bubble_1 ( int r[], int n) {int i= n -1; //初始时,最后位置保持不变while ( i> 0) { int pos= 0; //每趟开始时,无记录交换for (int j= 0; j< i; j++)if (r[j]> r[j+1]) {pos= j; //记录交换的位置 int tmp = r[j]; r[j]=r[j+1];r[j+1]=tmp;} i= pos; //为下一趟排序作准备}
}/*2.传统冒泡排序中每一趟排序操作只能找到一个最大值或最小值,我们考虑利用在每趟排序中进行正向和反向两遍冒泡的方法一次可以得到两个最终值(最大者和最小者) , 从而使排序趟数几乎减少了一半。
改进后的算法实现为:
*/
void Bubble_2 ( int r[], int n){int low = 0; int high= n -1; //设置变量的初始值int tmp,j;while (low < high) {for (j= low; j< high; ++j) //正向冒泡,找到最大者if (r[j]> r[j+1]) {tmp = r[j]; r[j]=r[j+1];r[j+1]=tmp;} --high; //修改high值, 前移一位for ( j=high; j>low; --j) //反向冒泡,找到最小者if (r[j]<r[j-1]) {tmp = r[j]; r[j]=r[j-1];r[j-1]=tmp;}++low; //修改low值,后移一位}
}
2、快速排序
#include <iostream>
#include <stack>
using namespace std;int GetKeyIndex(int array[], int left, int right)
{int mid = left + ((right - left)>>1);if(array[left] < array[right]){if(array[mid] < array[left])return left;if(array[mid] > array[right])return right;elsereturn mid;}else{if(array[mid] < array[right])return right;else if(array[mid] > array[left])return left;elsereturn mid;}
}int partion(int array[], int left, int right)
{int begin = left;int end = right-1;//三个数取中间int keyIndex = GetKeyIndex(array, left, right);if(keyIndex != right){std::swap(array[keyIndex], array[right]);}int key = array[right];while( begin < end ){while( begin < end && array[begin] <= key)begin++;while( begin < end && array[end] > key)end--;if(begin < end){std::swap(array[begin], array[end]);begin++;}}if(begin != right && array[begin] > array [right]){swap(array[begin], array [right]);return begin;}return right;
}void QuickSort(int array[], int left, int right)
{if(left < right){int div = partion(array, left, right);QuickSort(array, left, div - 1);QuickSort(array, div + 1, right);}
}/*int partion2(int array[], int left, int right)
{int begin = left;int end = right;三个数取中间//int keyIndex = GetKeyIndex(array, left, right);//if(keyIndex != right)//{// std::swap(array[keyIndex], right);//}int key = array[right];while( begin < end ){while( begin < end && array[begin] <= key)begin++;std::swap(array[begin], array[end]);while( begin < end && array[end] > key)end--;std::swap(array[begin], array[end]);}return begin;
}void QuickSort(int array[], int left, int right)
{if(left < right){int div = partion2(array, left, right);QuickSort(array, left, div - 1);QuickSort(array, div + 1, right);}
}int partion3(int array[], int left, int right)
{int begin = left;int end = right;int key = array[left];while( begin < end ){while( begin < end && array[end] >= key)end--;if(begin < end){array[begin] = array[end];begin++;}while( begin < end && array[begin] <= key)begin++;if(begin < end){array[end] = array[begin];end--;}}array[begin] = key;return begin;
}void QuickSort(int array[], int left, int right)
{if(left < right){int div = partion3(array, left, right);QuickSort(array, left, div - 1);QuickSort(array, div + 1, right);}
}int partion4(int array[], int left, int right)
{int Cur = left;int Prev = Cur - 1;int key = array[right];while(Cur <= right){if(array[Cur] < key && ++Prev != Cur)std::swap(array[Prev], array[Cur]);++Cur;}std::swap(array[++Prev], array[right]);return Prev;
}void QuickSort(int array[], int left, int right)
{if(left < right){int div = partion4(array, left, right);QuickSort(array, left, div - 1);QuickSort(array, div + 1, right);}
}void QuickSort_nor(int *array, int size)
{stack<int> s;s.push(size-1);s.push(0);while(!s.empty()){int left = s.top();s.pop();int right = s.top();s.pop();if(left < right){int div = partion3(array, left, right);s.push(right);s.push(div +1);s.push(div -1);s.push(left);}}
}
*/
数据结构:排序算法之交换排序(冒泡排序、快速排序)相关推荐
- 数据结构-排序算法(c语言实现篇)
数据结构-排序算法(c语言实现篇) 排序算法是非常常用的算法,从介绍排序的基本概念,到介绍各种排序算法的思想.实现方式以及效率分析.最后比较各种算法的优劣性和稳定性. 1 排序的概念及应用 1.1 排 ...
- 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)
我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...
- 数据结构---排序算法的总结
数据结构-排序算法的总结 分类 冒泡排序,时间复杂度O(n x n),空间复杂度O(1),稳定 简单选择排序,时间复杂度O(n x n),空间复杂度O(1),不稳定 希尔排序,时间复杂度O(n^1.3 ...
- 【数据结构排序算法系列】数据结构八大排序算法
排序算法在计算机应用中随处可见,如Windows操作系统的文件管理中会自动对用户创建的文件按照一定的规则排序(这个规则用户可以自定义,默认按照文件名排序)因此熟练掌握各种排序算法是非常重要的,本博客将 ...
- 数据结构-排序算法总结与感悟
数据结构-排序算法总结 一,排序的基本概念 排序:有n个记录的序列{R1,R2,-,Rn},其相应关键字的序列是{K1,K2, -,Kn },相应的下标序列为1,2,-, n.通过排序,要求找出当前下 ...
- C++基础-介绍·数据结构·排序·算法
C++基础-介绍·数据结构·排序·算法 特点 使用方向 RPC Data Struct 数据结构 栈 Stack 内存分配中的栈 队列 List 数组 Array 链表 LinkTable 树 Tre ...
- 排序算法:归并排序、快速排序
相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.归并排序: 1.工作原理: 归 ...
- Java十大排序算法总结,Java排序算法总结之冒泡排序
本文实例讲述了Java排序算法总结之冒泡排序.分享给大家供大家参考.具体分析如下: 前言:冒泡排序(BubbleSort)就是依次比较相邻的两个数,将小数放在前面,大数放在后面. 下面让我们一起 ...
- 数据结构排序算法(一):排序方法分类和各种排序方法的实现
一. 实验目的 1. 掌握各种常用排序的算法思想: 2. 掌握各种常用排序的算法实现: 3. 掌握各种常用排序时间复杂度,比较各种排序的优缺点. 二.排序算法的归类: 总的排序算法分为以下几类: 1. ...
- js排序算法详解-冒泡排序
全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-冒泡排序 1.1 原始人冒泡排序 function bubbleSort(arr) {var len = ar ...
最新文章
- mysql 可重复读 快照_MYSQL可重复读及原理、快照读和当前读
- 036_PageHeader页头
- [bootstrapValidator] - bootstrap的验证工具
- o2 atom(HP rw68xx)系列手机将可以使用Android。
- linux编译mmc驱动,Embeded linux之MMC驱动
- c语言给bmp图片加滤镜,关于BMP位图透明通道的详解制作教程, 教你输出透明的BMP位图...
- python3纵向输出字符串_python3字符串输出常见面试题总结
- 模型压缩+编译器优化,使AI算法在移动端性能超越专用硬件
- MyCat分布式数据库集群架构工作笔记0021---高可用_单表存储千万级_海量存储_水平分表全局表
- wow修改人物模型_一张照片生成人物动画!三星最新AI研究成果出炉
- chap8_1 Render to texture in OGRE
- Linux内核参数优化网络带宽,基于Linux内核的网络带宽管理
- centos 6.0 rpm 包编译环境的搭建
- 记录uluuuuuuu
- apache camel file(二)
- iredmail创建邮件群组
- 图灵革命如何颠覆我们对世界的认知?
- Null(空值)和 Undefined(未定义)
- linux执行可执行命令程序ls,linux运行可执行程序命令
- 编曲的和弦功能进行,及4736251谱子。