冒泡排序与快速排序
2016-04-16 21:08
183 查看
1 冒泡排序与快速排序
冒泡排序与快速排序属于互换类的排序方法。所谓互换排序是指借助数据元素之间的互相交换进行排序的一种方法。
1.1冒泡排序
算法情景:将一个无序的数组进行冒泡排序
冒泡排序方案1:
算法思路:冒泡排序方案1的排序思想就是外层循环n-1;内层循环n-i-1次,内层的每次的循环都是将最大的数字下沉到最后位置,意思就是说把最大的数字放到最后的位置,次大的放到最后位置的前一位,依此类推。
编码:
冒泡排序方案2:
算法思路:首先,从表头开始往后扫描线性表,在扫描过程中逐次比较相邻两个元素的大小。若相邻两个元素中,前面的元素大于后面的元素,则将他们交换,称之为消去一个逆序,最后将线性表中的最大者换到了表的最后。
然后,从后到前扫描剩下的线性表,同样在扫描过程中逐次比较相邻两个元素的大小。若相邻两个元素中,后面的元素小于前面的元素,则将它们互换,这样就又消失了一个逆序,最后将线性表中最小者换到了表的最前面,
对剩下的线性表重复上述过程,知道剩下的线性表变空为止,此时的线性表已经变为有序。
冒泡排序过程示意图如下所示:
编码:
1.2 快速排序
算法情景:将一个无序的数组进行快速排序
算法思路:
编码:
测试:
冒泡排序与快速排序属于互换类的排序方法。所谓互换排序是指借助数据元素之间的互相交换进行排序的一种方法。
1.1冒泡排序
算法情景:将一个无序的数组进行冒泡排序
冒泡排序方案1:
算法思路:冒泡排序方案1的排序思想就是外层循环n-1;内层循环n-i-1次,内层的每次的循环都是将最大的数字下沉到最后位置,意思就是说把最大的数字放到最后的位置,次大的放到最后位置的前一位,依此类推。
编码:
#include "stdafx.h" #include <iostream> #include <iomanip> using namespace std; template <class T> void bub1(T p[], int n){ T temp; for (int i = 0; i < n; i++) for (int j = 0; j < n - i - 1;j++) { if (p[j] > p[j + 1]) { temp = p[j]; p[j] = p[j + 1]; p[j + 1] = temp; } } } int _tmain(int argc, _TCHAR* argv[]){ double a[10] = { 5, 8, 12, 78, 96, 41, 20 ,3,255,24}; cout << "排序前:" << endl; for (int i = 0; i < 10; i++){ cout << setw(5) << a[i]; } bub1(a, 10); cout << "排序后:" << endl; for (int i = 0; i < 10; i++){ cout << setw(5) << a[i]; } return 0; }
冒泡排序方案2:
算法思路:首先,从表头开始往后扫描线性表,在扫描过程中逐次比较相邻两个元素的大小。若相邻两个元素中,前面的元素大于后面的元素,则将他们交换,称之为消去一个逆序,最后将线性表中的最大者换到了表的最后。
然后,从后到前扫描剩下的线性表,同样在扫描过程中逐次比较相邻两个元素的大小。若相邻两个元素中,后面的元素小于前面的元素,则将它们互换,这样就又消失了一个逆序,最后将线性表中最小者换到了表的最前面,
对剩下的线性表重复上述过程,知道剩下的线性表变空为止,此时的线性表已经变为有序。
冒泡排序过程示意图如下所示:
编码:
#include "stdafx.h" #include <iostream> #include <iomanip> using namespace std; template <class T> void bub2(T p[], int n){ int m, k, j, i; T temp; k = 0; m = n - 1; while (k < m) { j = m - 1; m = 0; for (i = k; i <= j;i++) //从前往后扫描 if (p[i]>p[i + 1]) //顺序不对,交换 { temp = p[i]; p[i] = p[i + 1]; p[i + 1] = temp; m = i; } j = k + 1; k = 0; for (i = m; i >= j;i--) //从后往前扫描 if (p[i-1]>p[i]) //顺序不对,交换 { temp = p[i]; p[i] = p[i - 1]; p[i - 1] = temp; k = i; } } return; } int _tmain(int argc, _TCHAR* argv[]) { int i, j; double p[50], r = 1.0; for (i = 0; i < 50;i++) //产生50个0-1之间的随机数 { r = 2053.0*r + 13849.0; j = r / 65536.0; r = r - j*65536.0; p[i] = r / 65536.0; } for (i = 0; i < 50; i++) //产生50个100-300之间的随机数 p[i] = 100.0 + 200.0*p[i]; cout << "排序前的序列:" << endl; for (i = 0; i < 10;i++) { for (j = 0; j < 5; j++)cout << setw(10) << p[5 * i + j]; cout << endl; } bub2(p, 10); //对原序列中的第11到第40个元素进行排序 cout << "排序后的序列:" << endl; for (i = 0; i < 10;i++) { for (j = 0; j < 5; j++)cout << setw(10) << p[5 * i + j]; cout << endl; } return 0; }
1.2 快速排序
算法情景:将一个无序的数组进行快速排序
算法思路:
编码:
测试:
相关文章推荐
- Hadoop平台搭建(1)
- JavaScript数组去重
- 分治-棋盘覆盖问题
- POJ 1753 Flip Game
- Adaboost
- 算法(三)--------扔鸡蛋问题和找零钱问题
- C++ 类型转换操作符(Type Conversion Operators)
- 添加物理引擎 小小的优化 4-15
- Map 的初始容量是多少(hashMap)
- 最长递增子序列O(NlogN)算法(leetcode 300. Longest Increasing Subsequence )
- spinner 的使用
- Linux Server
- Ubuntu 14.04 为 root 帐号开启 SSH 登录
- 如何查看hadoop与hbase的版本匹配关系
- [Google Codejam] Round 1A 2016 - Rank and File
- Samba 服务的配置
- 解决maven项目提示struts action not found
- 解决maven项目提示struts action not found
- eterna框架-环境搭建(续)
- leetcode——49——Group Anagrams