排序算法,结合大话数据结构使用更佳
不稳定的排序:希尔,堆,快排
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
class Sort{
public:
//1. 冒泡排序法
void Bubble(vector<int> &a)
{
int len = a.size();
for(int i = 0; i < len; ++i)
{
for(int j = len-1; j > i; --j)
{
if(a[j]<a[i])
swap(a[j],a[i]);
}
}
}
//2. 选择排序法
void Select(vector<int> &a)
{
int len = a.size();
for(int i = 0; i < len; ++i)
{
int loc = i;
for(int j = i+1; j < len; ++j)
{
if(a[loc]>a[j])
loc = j;
}
if(loc != i)
swap(a[loc],a[i]);
}
}
//3. 直接插入排序
void InsertSort(vector<int> &a)
{
int len = a.size();
int temp = a[0];
for(int i = 1; i < len; ++i)
{
//如果后面有一张牌比前面的牌小
if(a[i]<a[i-1])
{
temp = a[i];
int j;
for(j = i-1; j >= 0&& a[j]>temp; j--)
{
//牌后移
a[j+1] = a[j];
}
a[j+1] = temp;
}
}
}
//4. 希尔排序法
void Shell(vector<int> &a)
{
int len = a.size();
int gap = len/3;
do{
gap = gap / 3 + 1;
for(int i = gap; i < len; ++i)
{
if(a[i]<a[i-gap])
{
int j;
int temp = a[i];
for( j = i - gap; j >= 0 && a[j] > temp; j -= gap)
a[j+gap] = a[j];
a[j+gap] = temp;
}
}
}while(gap>1);
}
//5. 堆排序
void HeapSort(vector<int> &a)
{
int len = a.size();
for(int i = len/2-1; i >= 0; i--)
HeapAdjust(a,i,len);
for(int i = len-1; i>0; i--)
{
swap(a[0],a[i]);
HeapAdjust(a,0,i);
}
}
void HeapAdjust(vector<int>&a, int begin, int len)
{
int temp = a[begin];
for(int i = 2 * begin + 1; i<len; i++)
{
if(i<len-1&&a[i]<a[i+1])
i++;
if(a[i]<temp)
break;
a[begin] = a[i];
begin = i;
}
a[begin] = temp;
}
//6. 归并排序
void MergeSort(vector<int>&a)
{
int len = a.size();
vector<int> temp(len,0);
MergeSplit(a,temp,0,len-1);
}
void MergeSplit(vector<int> &a,vector<int> &temp,int begin,int end)
{
if(begin>=end)
return;
int mid = (begin + end) / 2;
MergeSplit(a,temp,begin,mid);
MergeSplit(a,temp,mid+1,end);
Merge(a,temp,begin,end,mid);
}
void Merge(vector<int>&a,vector<int> &temp,int begin,int end, int mid)
{
int k = 0, i = begin, j = mid +1;
while(i <= mid && j <= end)
{
if(a[i] < a[j])
{
temp[k] = a[i];
i++;
}
else
{
temp[k] = a[j];
j++;
}
k++;
}
while(i<=mid)
temp[k++] = a[i++];
while(j <= end)
temp[k++] = a[j++];
for(int i = begin, k = 0; i <= end; i++,k++ )
{
a[i] = temp[k];
}
}
//7. 快速排序
void Qsort(vector<int> &a)
{
int len = a.size();
quickly(a,0,len-1);
}
void quickly(vector<int> &a,int begin,int end)
{
if(begin>end)
return;
int loc = Partition(a,begin,end);
quickly(a,begin,loc-1);
quickly(a,loc+1,end);
}
int Partition(vector<int> &a,int begin,int end)
{
int temp = a[begin];
while(begin<end)
{
while(begin<end&&temp <= a[end])
end--;
if(begin<end)
swap(a[begin],a[end]);
while(begin<end&&temp >= a[begin])
begin++;
if(begin<end)
swap(a[begin],a[end]);
}
return begin;
}
void print(vector<int> a)
{
for(int i = 0; i < a.size(); ++i)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
vector<int> insert(int a[],int sz)
{
vector<int> res;
for(int i = 0; i < sz; ++i)
res.push_back(a[i]) ;
return res;
}
};
int main()
{
Sort s;
int a[9] = {3,5,6,2,7,4,1,0,8};
int sz = sizeof(a) / sizeof(int);
vector<int> input = s.insert(a,sz);
s.MergeSort(input);
s.print(input);
}