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

【算法】几种排序代码

2017-03-17 17:53 465 查看
#include<iostream>
#include<cstdlib>
using namespace std;
int ThreeMid(int * arr,int left,int right)
{
int mid=left+((right-left)>>1);
while (left<right)
{
if(arr[left]<arr[right])
{
if(arr[mid]<arr[left])
return left;
else if(arr[right]<arr[mid])
return right;
else
return mid;
}
if(arr[left]>arr[right])
{
if(arr[mid]<arr[right])
return right;
else if(arr[mid]>arr[left])
return left;
else
return mid;
}
}
return mid;
}
void PopSort(int* arr,int len)
{
for (int i=0;i<len;i++)
{
for(int j=i+1;j<len;j++)
{
if (arr[i]>arr[i+1])
{
int tmp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=tmp;
}
}
}
}
void selectSort(int* arr,int len)
{
int min;
int tmp;
for(int i=0;i<len;i++)
{
for (int j=0;j<len;j++)
{
min=i;
if(arr[min]>arr[j])
{
min=j;
}
tmp=arr[min];
arr[min]=arr[j];
arr[j]=tmp;
}
}
}
void selectSort2(int* arr,int len)
{
int left=0;
int right=len-1;
while (left<right)
{
int min=left;
int max=right;
for(int i=left;i<=right;i++)
{
if (arr[min]>=arr[i])
{
min=i;
}
if(arr[max]<=arr[i])
{
max=i;
}
}
swap(arr[left],arr[min]);
if(left==max)
{
max=min;
}
swap(arr[right],arr[max]);
left++;
right--;
}
}
void InsertSort(int* arr,int len)
{
for(int i=1;i<len;i++)
{
int tmp=arr[i];
int pos=i-1;
while (pos>=0&&arr[pos]>tmp)
{
arr[pos+1]=arr[pos];
pos--;

}
arr[pos+1]=tmp;
}
}
void ShellSort(int* arr,int len)
{
int gap=len/3+1;
for (int i=gap;i<len;i++)
{
int tmp=arr[i];
int pos=i-gap;
while (pos>=0&&arr[pos]>tmp)
{
arr[pos+gap]=arr[pos];
pos-=gap;
}
arr[pos+gap]=tmp;
}
}
void FastSort(int* arr,int low,int high)
{
if(low>=high)
return;
int first=low;
int last=high;
int mid=ThreeMid(arr,first,last);
swap(arr[mid],arr[first]);
int key=arr[first];
while (first<last)
{
while (first<last&&arr[last]>=key)
{
--last;
}
arr[first]=arr[last];
while (first<last&&arr[first]<=key)
{
++first;
}
arr[last]=arr[first];
}
arr[first]=key;
FastSort(arr,low,first-1);
FastSort(arr,first+1,high);
}
int PartSort(int* arr,int first,int last)
{
int left=first;
int right=last;
int key=ThreeMid(arr,first,last);
swap(arr[key],arr[last]);
int tmp=arr[last];
while (left<right)
{
while (left<right&&arr[left]<=tmp)
{
++left;
}
arr[right]=arr[left];
while (left<right&&arr[right]>=tmp)
{
--right;
}
arr[left]=arr[right];
}
arr[left]=tmp;
return left;

}
void QuickSort(int* arr,int first,int last)
{
if (first<last)
{
int key=PartSort(arr,first,last);
QuickSort(arr,first,key-1);
QuickSort(arr,key+1,last);
}
}
//快排优化,少于13个数用插入排序
void QuickSort2(int* arr,int first,int last)
{
if (first<last)
{
if((last-first)>=13)
{
int key=PartSort(arr,first,last);
QuickSort2(arr,first,key-1);
QuickSort2(arr,key+1,last);
}
else
InsertSort(arr,sizeof(arr)/sizeof(int));

}
}
//归并排序
void Merge(int* arr,int* tmp,int first,int mid,int last)//归并
{
int i=first;
int j=mid+1;
int k=first;
while (i!=mid+1&&j!=last+1)
{
if(arr[i]>arr[j])
tmp[k++]=arr[j++];
else
tmp[k++]=arr[i++];
}
while(i!=mid+1)
{
tmp[k++]=arr[i++];
}
while (j!=last+1)
{
tmp[k++]=arr[j++];
}
for(i=first;i<=last;i++)
arr[i]=tmp[i];
}

void MergeSort(int* arr,int* tmp,int first,int last)//归并排序
{
int mid;
if (first<last)
{
mid= first+((last-first)>>1);
MergeSort(arr,tmp,first,mid);
MergeSort(arr,tmp,mid+1,last);
Merge(arr,tmp,first,mid,last);
}
}
void Print(int *arr,int len)
{
for(int i=0;i<len;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
}
void test()
{
int arr[]={9,3,5,1,4,7,8,0};
int tmp[8];
//int arr[]={2,3,6,5,4,13,56};
cout<<"原数组  : ";
Print(arr,sizeof(arr)/sizeof(arr[0]));
InsertSort(arr,sizeof(arr)/sizeof(arr[0]));
cout<<"插入排序: ";
Print(arr,sizeof(arr)/sizeof(arr[0]));
ShellSort(arr,sizeof(arr)/sizeof(arr[0]));
cout<<"希尔排序: ";
Print(arr,sizeof(arr)/sizeof(arr[0]));
PopSort(arr,sizeof(arr)/sizeof(arr[0]));
cout<<"冒泡排序: ";
Print(arr,sizeof(arr)/sizeof(arr[0]));
selectSort(arr,sizeof(arr)/sizeof(arr[0]));
cout<<"选择排序: ";
Print(arr,sizeof(arr)/sizeof(arr[0]));
FastSort(arr,0,sizeof(arr)/sizeof(arr[0])-1);
cout<<"快速排序: ";
Print(arr,sizeof(arr)/sizeof(arr[0]));
QuickSort(arr,0,sizeof(arr)/sizeof(arr[0])-1);
cout<<"快速排序2: ";
Print(arr,sizeof(arr)/sizeof(arr[0]));
MergeSort(arr,tmp,0,sizeof(arr)/sizeof(arr[0])-1);
cout<<"归并排序: ";
Print(arr,sizeof(arr)/sizeof(arr[0]));
QuickSort2(arr,0,sizeof(arr)/sizeof(arr[0])-1);
cout<<"快速排序3:";
Print(arr,sizeof(arr)/sizeof(arr[0]));
}


#include "Sort.h"
int main()
{
test();
system("pause");
return 0;
}


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