排序算法(C++实现)
2015-07-15 16:57
423 查看
#include <vector> using std::vector; template<typename T> void swap(vector<T> &a, int i, int j) { T tmp = a[i]; a[i] = a[j]; a[j] = tmp; } //简单插入排序 template<typename T> void insertionSort(vector<T> &a) { for(int p=1; p!=a.size(); ++p) { int tmp = a[p], j; for(j = p; j>0&&a[j-1]>tmp; --j) a[j] = a[j-1]; a[j] = tmp; } } //堆排序 //把将要进行排序的元素依次入堆,再逐个弹出,便得到排好序的元素序列。 //堆的C++实现:http://www.cnblogs.com/pczhou/p/4648146.html //归并排序 template<typename T> void mergeSort(vector<T> &a) { vector<T> tmpA(a.size()); mergeSort(a, tmpA, 0, a.size()-1); } template<typename T> void mergeSort(vector<T> &a, vector<T> &tmpA, int left, int right) { if(left<right) { int mid = (left+right)/2; mergeSort(a, tmpA, left, mid); mergeSort(a, tmpA, mid+1, right); merge(a, tmpA, left, mid+1, right); } } template<typename T> void merge(vector<T> &a, vector<T> &tmpA, int leftPos, int rightPos, int rightEnd) { int leftEnd = rightPos-1, tmpPos = leftPos; int numElements = rightEnd-leftPos+1; while(leftPos<=leftEnd&&rightPos<=rightEnd) { if(a[leftPos]<a[rightPos]) tmpA[tmpPos++] = a[leftPos++]; else tmpA[tmpPos++] = a[rightPos++]; } while(leftPos<=leftEnd) tmpA[tmpPos++] = a[leftPos++]; while(rightPos<=rightEnd) tmpA[tmpPos++] = a[rightPos++]; for(; numElements; --numElements, --rightEnd) a[rightEnd] = tmpA[rightEnd]; } //快速排序 //(采用三数中值分割法确定枢纽元) template<typename T> void quickSort(vector<T> &a) { quickSort(a, 0, a.size()-1); } template<typename T> const T& median3(vector<T> &a, int left, int right) { int mid = (left+right)/2; if(a[left]<a[mid]&&a[mid]<a[right]||a[right]<a[mid]&&a[mid]<a[left]) swap(a, mid, right); else if(a[mid]<a[left]&&a[left]<a[right]||a[right]<a[left]&&a[left]<a[mid]) swap(a, left, right); return a[right]; } template<typename T> void quickSort(vector<T> &a, int left, int right) { if(left<right) { T pivot = median3(a, left, right); int i=left-1, j=left; for(; j<right; ++j) { if(a[j]<pivot) { ++i; swap(a, i, j); } } swap(a, i+1, right); quickSort(a, left, i); quickSort(a, i+2, right); } } //桶排序 //假设:所有输入数据均为非负,且不超过M const int M = 100; void bucketSort(vector<int> &a) { vector<int> count(M+1); for(int i=0; i!=count.size(); ++i) count[i] = 0; for(int i=0; i!=a.size(); ++i) ++count[a[i]]; int k = 0; for(int i=0; i!=count.size(); ++i) for(int j=0; j<count[i]; ++j) a[k++] = i; }
测试代码:
vector<int> a1, a2, a3, a4; for(int i=0; i<10; ++i) { int tmp; cout<<"please input: "; cin>>tmp; a1.push_back(tmp); a2.push_back(tmp); a3.push_back(tmp); a4.push_back(tmp); } insertionSort(a1); mergeSort(a2); quickSort(a3); bucketSort(a4); cout<<"insertion sort:"<<endl; for(int i=0; i!=a1.size(); ++i) cout<<" "<<a1[i]; cout<<endl; cout<<"merge sort:"<<endl; for(int i=0; i!=a2.size(); ++i) cout<<" "<<a2[i]; cout<<endl; cout<<"quick sort:"<<endl; for(int i=0; i!=a3.size(); ++i) cout<<" "<<a3[i]; cout<<endl; cout<<"bucket sort:"<<endl; for(int i=0; i!=a4.size(); ++i) cout<<" "<<a4[i]; cout<<endl;
测试结果:
相关文章推荐
- C#调用C++方法,C#使用c++方法返回类或结构体
- android support c++11
- C语言实现字符的反转输出
- extern关键字使用方法
- C++定义不能被继承的类
- C语言内存管理
- C++ Json处理
- c语言详解sizeof
- C++ 线程池,任务池实现实例
- C++ 语法学习笔记
- C++前缀自增/后缀自增及重载
- C++派生访问控制说明符
- 黑马程序员------C语言中sizeof运算符的使用
- 语言[C/C++]_按位与、或、异或等运算方法
- 自己对C语言中scanf语句接受字符串的一点理解
- stl变易算法(三)
- C语言如何 计算程序运行时间
- c++ 中关于static 关键字几点小结
- C++ LOL OJ 计算火车停站方案
- [C++设计模式] decorator 装饰者模式