自己动手实现数据结构——排序算法1(冒泡、插入、归并、简单选择)(C++实现)
来源:互联网 发布:炭知天下价目表 编辑:程序博客网 时间:2024/06/05 20:54
冒泡排序
冒泡排序作为最简单的排序算法、两行for循环即可搞定。
步骤:一、从前到后依次比较相邻两个数大小,若是前面比后面大则将两个数交换位置,这样第一轮最大的一个数便会被交换到最后面。
二、重复一的步骤依次比较(但是最后一个数不需要参与比较,因为第一轮已经选出它最大),选出倒数第二大的。
。。。。
三、直到所有的数都不需要比较则排序成功
例子就不举了,直接实现:
buddle.cc
#include<iostream>#include<vector>using namespace std;template< class T >void buddle( vector<T> &a ){ int length = a.size(); for ( int i = length-1 ; i > 0; --i) for( int j = 0; j < i; j ++){ if ( a[j] > a[j+1] ) swap(a[j], a[j+1]); }}int main(int argc, char **argv){ vector<int> a = {10, 8, 9, 1, 7, 4, 11, 23, 3, 2, 5}; vector<int>::iterator iter; buddle<int>( a ); for( iter = a.begin(); iter != a.end(); iter++){ cout<< *iter <<" "; } cout << endl; return 0;}
运行结果:
简单选择排序
1、从1——n个数中选择最小的数,将它放在第一位
2、从2——n个数中选择最小的数,将它放在最后一位
。。。
代码:select.cc
#include<iostream>#include<vector>using namespace std;template< class T >void select_sort(vector<T> &a){ int length = a.size(); int min = 0; for ( int i = 0; i < length; i++){ for( int j = i; j < length; j++){ if ( a[j] < a[min] ) min = j; } if ( i != min ) swap(a[i], a[min]); }}int main(int argc, char **argv){ vector<int> a = {10, 8, 9, 1, 7, 4, 11, 23, 3, 2, 5}; vector<int>::iterator iter; select_sort<int>( a ); for( iter = a.begin(); iter != a.end(); iter++){ cout<< *iter <<" "; } cout << endl; return 0;}运行结果
插入排序
类似于打斗地主时候的插牌程序。
每次将一个数插入一个已经排好的序列中,使之依然有序,插入的时候可以采用折半插入的形式(即采用二分查找的方式确定要插入的位置)
上代码:half_insert.cc
#include<iostream>#include<vector>using namespace std;template< class T >void half_insert(vector<T> &a){ int length = a.size(); int low,mid,high; T tmp; for ( int i = 1; i < length; ++i){ low = 0; high = i-1; while( low <= high ){ mid = (low + high)/2; if ( a[i] > a[mid] ) low = mid + 1; else high = mid-1; } tmp = a[i]; for(int j = i; j > low; --j) a[j] = a[j-1]; a[low] = tmp; }}int main(int argc, char **argv){ vector<int> a = {10, 8, 9, 1, 7, 4, 11, 23, 3, 2, 5}; vector<int>::iterator iter; half_insert<int>( a ); for( iter = a.begin(); iter != a.end(); iter++){ cout<< *iter <<" "; } cout << endl; return 0;}
运行结果:
归并排序
这里是二路归并排序
使用merge_sort递归地将序列分成两个子序列,然后再调用merge函数将两个子序列合并成一个有序的序列
代码实现:merge.cc
#include<iostream>#include<vector>using namespace std;const int MAX = 0x7fffffff;template< class T >void merge(vector<T> &a, int begin, int mid, int end){ int length1 = mid-begin+1; int length2 = end-mid+1; int tag1 = 0; int tag2 = 0; int tag = begin; vector<T> vec1(length1+1); vector<T> vec2(length2+1); for ( int i = begin ; i <= mid; i++ ) vec1[tag1++] = a[i]; vec1[tag1] = MAX; for ( int i = mid+1; i <= end; i++) vec2[tag2++] = a[i]; vec2[tag2] = MAX; tag1 = 0; tag2 = 0; while(tag <= end ){ if ( vec1[tag1] < vec2[tag2] ) a[tag++] = vec1[tag1++]; else a[tag++] = vec2[tag2++]; }}template< class T >void merge_sort(vector<T> &a, int begin, int end){ if ( begin < end ){ int mid = (begin + end)/2; merge_sort(a, begin, mid); merge_sort(a, mid+1, end); merge(a, begin, mid, end); }}int main(int argc, char **argv){ vector<int> a = {10, 8, 9, 1, 7, 4, 11, 23, 3, 2, 5}; vector<int>::iterator iter; merge_sort(a, 0, a.size()-1); for( iter = a.begin(); iter != a.end(); iter++){ cout<< *iter <<" "; } cout << endl; return 0;}
运行结果:
0 0
- 自己动手实现数据结构——排序算法1(冒泡、插入、归并、简单选择)(C++实现)
- c语言简单实现 冒泡,插入,选择,归并排序
- 常见排序算法C++实现(冒泡,直接插入,希尔,堆,归并,简单选择,快排)
- 排序算法总结与C++实现(冒泡、简单选择、直接插入、堆、归并、快速)
- 小白学数据结构——四、排序算法Python(冒泡、选择、快速、插入、希尔、归并排序)
- 排序(快排,冒泡,堆排序,插入排序,归并排序,选择排序)算法Java实现
- 排序及选择算法的java实现(一)选择、冒泡、插入、希尔、归并、快排
- 常见排序算法总结与实现(冒泡、插入、选择、希尔、堆排序、归并、快排)
- 常见排序算法(冒泡、选择、插入、快速、归并C++实现)
- 常用排序算法简介与java实现(冒泡、插入、选择、希尔、归并、快排)
- 常用排序算法的js实现(冒泡、选择、插入、归并、希尔、快排)
- 数据结构和算法——排序算法(冒泡法 选择法 插入法 快速法)实现
- js实现冒泡、选择、插入、归并、快速排序算法
- (数据结构排序的实验四)快速,冒泡,简单选择,直接插入排序的c语言实现!!
- (九)数据结构之简单排序算法实现:冒泡排序、插入排序和选择排序
- 数据结构与算法(二)冒泡&&插入&&选择 简单排序
- 插入,归并,快速,冒泡,shell,选择排序 用c实现
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序
- Android 内存优化总结
- android ListView奇偶行显示不同颜色
- hdu-2087 剪花布条
- mongodb pre-splitting sharding测试
- 知识点四:Menu和actionBar用法
- 自己动手实现数据结构——排序算法1(冒泡、插入、归并、简单选择)(C++实现)
- C++与Java的语法区别
- Linux内核启动中显示的logo的修改
- OSGI(Felix)项目开发和持续集成流程
- Java数字时钟(现在是北京时间 20:13:14)
- MySQL必知必会笔记(一)
- 中国创客面临无限挑战
- 深入浅出FFMPEG
- Git新手向引导——Git进阶