排序算法
交换排序算法主要有:(1)冒泡法(2)快速排序法
冒泡法:两两相邻记录进行比较,如果反序这交换,直到没有反序的记录为止。
#include <iostream> #include <vector> using namespace std; //这种交换方式效率较低 vector<int> BubbleSort(vector<int> &vec) { for(int i=0; i<vec.size(); i++) { for(int j = i+1; j<vec.size(); j++) { if(vec[i] > vec[j]) { // exchange using XOR vec[i] = vec[i] ^ vec[j]; vec[j] = vec[i] ^ vec[j]; vec[i] = vec[i] ^ vec[j]; } } } return vec; } //这种交换方式效率较高 vector<int> BubbleSort2(vector<int> vec) { for(int i=0; i<vec.size(); i++) { for(int j=vec.size()-1; j>i; j--) { if(vec[j] < vec[j-1]) { // exchange using XOR vec[j] = vec[j] ^ vec[j-1]; vec[j-1] = vec[j] ^ vec[j-1]; vec[j] = vec[j] ^ vec[j-1]; } } } return vec; } //这种交换方式效率更高,使用了一个标记符号flag避免无意义的循环 vector<int> BubbleSort3(vector<int> vec) { bool flag = true; for(int i=0; i < vec.size() && flag; i++) { flag = false; for(int j=vec.size()-1; j>i; j--) { if(vec[j] < vec[j-1]) { // exchange using XOR vec[j] = vec[j] ^ vec[j-1]; vec[j-1] = vec[j] ^ vec[j-1]; vec[j] = vec[j] ^ vec[j-1]; flag = true; } } } return vec; } int main() { vector<int> vec; int temp; cout<<"please input the data source, \ integer in on row separated by space or comma"<<endl; while(1) { cin>>temp; vec.push_back(temp); if(cin.get() == '\n') break; } vector<int> sorted_vec = BubbleSort3(vec); vector<int>::iterator iter = sorted_vec.begin(); for(; iter != sorted_vec.end(); iter++) { cout<<*iter<<" "; } return 0; }
快速排序:通过一趟排序将待排序的记录分割成独立的两个部分,其中一部分记录的值比关键字小,另一部分的记录都比关键字大。然后对着独立的部分进行递归操作,即可得到最后的排序结果。
#include <iostream> #include <string> using namespace std; void QSort(int a[], int left, int right) { if(left >= right) { return; } int i = left; int j = right; int key = a[left]; //用第一个记录作为关键字 while(i<j) { while(i<j && key <= a[j]) { j--; //向左寻找 } a[i] = a[j]; //找到一个比key小的元素,放在i的位置上 while(i<j && key >= a[i]) { i++; } a[j] = a[i]; } a[i] = key; //按照主键分类完成后,将主键放到中间的位置上 QSort(a, left,i-1); //按照同样的方法,对划分出来的子集,再次做快速排序 QSort(a, i+1, right); } int main() { int src[100]; int len = 0; cout<<"please input the data source :"<<endl; while(1) { cin>>src[len++]; if(cin.get() == '\n') break; } QSort(src,0,len-1); for(int i=0; i<len; i++) { cout<<src[i]<<" "; } cin.get(); return 0; }