冒泡排序
冒泡排序作为最简单的排序算法、两行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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
自己动手实现数据结构——排序算法1(冒泡、插入、归并、简单选择)(C++实现)
原文地址:http://blog.csdn.net/sshhiixx/article/details/47398419