您的位置:首页 > 编程语言 > C语言/C++

排序算法(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;


测试结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: