标签:sort
常见的比较排序如下:
以下就用C++一个个实现它们
#include<iostream>
#include<assert.h>
using namespace std;
//插入排序(便于看复杂度)
template<class T>
void InsertSort1(T arr[],const int& size)
{
for(int i=0;i<size;i++)
{
for(int end=i;end>=0;end--)
{
if(arr[end-1]>arr[end])
{
swap(arr[end],arr[end-1]);
}
}
}
}
template<class T>
void InsertSort2(T arr[],const int& size)
{
for(int i=0;i<size-1;i++)
{
int end=i;
T tmp=arr[end+1];
while(end>=0)
{
if(arr[end]>tmp)
{
arr[end+1]=arr[end];
end--;
}
else
break;
}
arr[end+1]=tmp;
}
}
//希尔排序
template<class T>
void ShellSort(T arr[],const int& size)
{
int gap=size;
while(gap>1)
{
gap=gap/3+1;
for(int i=0;i<size-gap;i++)
{
int end=i;
T tmp=arr[end+gap];
while(end>=0)
{
if(arr[end]>tmp)
{
arr[end+gap]=arr[end];
end-=gap;
}
else
break;
}
arr[end+gap]=tmp;
}
}
}
//选择排序
template<class T>
void SelectSort(T arr[],const int& size)
{
for(int i=0;i<size;i++)
{
int index=i;
for(int j=i+1;j<size;j++)
{
if(arr[j]<arr[index])
{
index=j;
}
}
swap(arr[index],arr[i]);
}
}
//堆排序
template<class T>
void HeapSort(T array[],const int size)
{
int Size=size;
while(Size>1)
{
for(int i=(Size-2)/2;i>=0;i--)
{
AdjustDown(array,i,Size);
}
swap(array[0],array[Size-1]);
Size-=1;
}
}
template<class T>
void AdjustDown(T array[],int parent,int size)
{
int child=parent*2+1;
while(child<size)
{
if((child+1<size)&&(array[child+1]>array[child]))
swap(array[child],array[child+1]);
if(array[child]>array[parent])
{
swap(array[child],array[parent]);
parent=child;
child=parent*2+1;
}
else
break;
}
}
//冒泡排序
//依次比较相邻两个数的大小,小的在前,大的在后,比如a[0]和a[1]比,然后a[1]和a[2]....比完第一轮,最大的数已经排在最后。
//第二轮和第一轮一样,a[0]和a[1],只不过,上一轮已经比出了比较大的数,所以比上一轮少比一次
//缺陷:
//时间复杂度:
template<class T>
void BubbleSort(T arr[],const int& size)
{
for(int i=0;i<size-1;i++)
{
for(int j=0;j<size-1-i;j++)
{
if(arr[j]>arr[j+1])
swap(arr[j],arr[j+1]);
}
}
}
//自己按脑袋的思路写的
template<class T>
void Sort(T arr[],const int& size)
{
T Tag=size-1;
for(int i=0;i<size-1;i++)
{
T start=0;
T end=Tag-1;
while(start<=end)
{
if(arr[end]>arr[Tag])
{
swap(arr[end],arr[Tag]);
}
else
end--;
if(arr[start]>arr[Tag])
{
swap(arr[start],arr[Tag]);
}
else
start++;
}
Tag--;
}
}
//快速排序
template<class T>
void QuickSort(T arr[],int size)
{
int start=0;
int end=size-2;
_QuickSort(arr,start,end);
}
template<class T>
void _QuickSort(T arr[],int start,int end)
{
if(start<end)
{
int min=PartSort(arr,start,end);
_QuickSort(arr,start,min-2);
_QuickSort(arr,min,end);
}
}
template<class T>
T& PartSort(T arr[],int start,int end)
{
//T key=arr[end+1];
int KeyIndex=end+1;
while(start<end)
{
//左边找大的
while(arr[start]<arr[KeyIndex]&&end>start)
{
start++;
}
//右边找小的
while(arr[end]>arr[KeyIndex]&&end>start)
{
end--;
}
if(end<=start)
swap(arr[end],arr[KeyIndex]);
else
swap(arr[start],arr[end]);
}
//只有两个数
if(start==end&&arr[end]>arr[KeyIndex])
{
swap(arr[end],arr[KeyIndex]);
}
return start;
}
//归并排序
template<class T>
void MergeSort(T arr[],int size)
{
T* tmp=new T[size];
_MergeSort(arr,tmp,0,size-1);
delete[] tmp;
}
template<class T>
void _MergeSort(T* src,T* dest,int left,int right)
{
//递归分割
if(left<right)
{
int mid=left+((right-left)>>1);
_MergeSort(src,dest,left,mid);
_MergeSort(src,dest,mid+1,right);
//合并
Merge(src,dest,left,mid,mid+1,right);
memcpy(src+left,dest+left,(right-left+1)*sizeof(int));
}
}
template<class T>
void Merge(T* src,T* dest,int left1,int right1,int left2,int right2)
{
//类似合并两个单链表
assert(src&&dest);
int i=left1;
while((left1<=right1)&&(left2<=right2))
{
if(src[left1]<=src[left2])
{
dest[i++]=src[left1++];
}
else
{
dest[i++]=src[left2++];
}
}
while(left1<=right1)
{
dest[i++]=src[left1++];
}
while(left2<=right2)
{
dest[i++]=src[left2++];
}
}
template<class T>
void Print(T arr[],const int& size)
{
for(int i=0;i<size;i++)
cout<<arr[i]<<" ";
cout<<endl;
}
void Test1()
{
//int array[]={2,7,5,1,3};
int array[]={2,0,4,9,3,6,8,7,1,5};
int len=sizeof(array)/sizeof(array[0]);
//int* arrp = array;//&时
/*InsertSort1<int>(array,len);
Print(array,len);*/
/*InsertSort2<int>(array,len);
Print(array,len);*/
/*ShellSort<int>(array,len);
Print(array,len);*/
//SelectSort<int>(array,len);
//Print(array,len);
/*BubbleSort<int>(array,len);
Print(array,len);*/
//数组的引用?
/*QuickSort<int>(array,len);
Print(array,len);*/
MergeSort<int>(array,len);
Print(array,len);
}
int main()
{
Test1();
system("pause");
return 0;
}本文出自 “sunshine225” 博客,请务必保留此出处http://10707460.blog.51cto.com/10697460/1759221
标签:sort
原文地址:http://10707460.blog.51cto.com/10697460/1759221