排序算法的实现

//                排序算法的实现
#include <iostream>
using namespace std;


//插入排序
void swap(int Array[],int i,int j)
{
 int temp=Array[i];
 Array[i]=Array[j];
 Array[j]=temp;
}
void InsertSort(int Array[],int n)
{
 for(int i=1;i<n;i++)
 {
  for(int j=i;j>0;j--)
  {
   if(Array[j]<Array[j-1])
    swap(Array,j,j-1);
   else break;
  }
 }
}
//优化插入排序
void ImprovedInertSorter(int Array[],int n)
{
 int  Temp;
 for(int i=1;i<n;i++)
 {
  Temp=Array[i];
  int j=i-1;
  while((j>=0)&&(Temp<Array[j]))
  {
   Array[j+1]=Array[j];
   j=j-1;
  }
  Array[j+1]=Temp;
 }
}
//二分法插入排序
void BinaryInsertSorter(int Array[],int n)
{
 int temp;
 int left,right,middle;
 for(int i=1;i<n;i++)
 {
  temp=Array[i];
  left=0;right=i-1;
  while(left<=right)
  {
   middle=(left+right)/2;
   if(temp<Array[middle])
    right=middle-1;
   else
    left=middle+1;
  }
  for(int j=i-1;j>=left;j--)
   Array[j+1]=Array[j];
  Array[left]=temp;
 }
}
//优化冒泡排序
void ImprovedBubbleSorter(int Array[],int n)
{
 bool NoSwap;
 for(int i=1;i<n;i++)
 {
  NoSwap=true;
  for(int j=n-1;j>=i;j--)
  if(Array[j],Array[j-1])
  {
   swap(Array,j,j-1);
   NoSwap=false;
  }
  if(NoSwap)
   return;
 }
}

//直接选择排序
void StraighSelectSorter(int Array[],int n)
{
 for(int i=0;i<n-1;i++)
 {
  int Smallest=i;
  for(int j=i+1;j<n;j++)
  {
   if(Array[j]<Array[Smallest])
    Smallest=j;
  }
  swap(Array,i,Smallest);
 }
}

//Shell排序
void ModifiedInsertSort(int Array[],int n,int delta)
{
 for(int i=delta;i<n;i+=delta)
   for(int j=i;j>=delta;j-=delta)
   {
    if(Array[j]<Array[j-delta])
     swap(Array,j,j-delta);
    else
     break;
   }
}
void ShellSorter(int Array[],int n)
{
 for(int delta=n/2;delta>0;delta/=2)
  for(int j=0;j<delta;j++)
   ModifiedInsertSort(&Array[j],n-j,delta);
}

//优化的快速排序
int SelectPivot(int left,int right)
{
 return (left+right)/2;
}
int Partition(int Array[],int left,int right)
{
 int  temp;
 int i=left;
 int j=right;
 temp=Array[j];
 while(i!=j)
 {
  while((Array[i]<temp)&&(j>i))
   i++;
  if(i<j)
  {
   Array[j]=Array[i];
   j--;
  }
  while((Array[j]>temp)&&(j>i))
   j--;
  if(i<j)
  {
   Array[i]=Array[j];
   i++;
  }
 }
 Array[i]=temp;
 return i;
}
void ImprovedQuickSorter(int Array[],int left,int right)
{
 if(right<=left)
  return ;
 int pivot=SelectPivot(left,right);
 swap(Array,pivot,right);
 pivot=Partition(Array,left,right);
 ImprovedQuickSorter(Array,left,pivot-1);
 ImprovedQuickSorter(Array,pivot+1,right);
}

//两路归并排序

void Merge(int Array[],int TempArray[],int left,int right,int middle)
{
 for(int j=left;j<=right;j++)
  TempArray[j]=Array[j];
 int index1=left;
 int index2=middle+1;
 int i=left;
 while((index1<=middle)&&(index2<=right))
 {
  if(TempArray[index1]<TempArray[index2])
   Array[i++]=TempArray[index1++];
  else
   Array[i++]=TempArray[index2++];
 }
 while(index1<=middle)
  Array[i++]=TempArray[index1++];
 while(index2<=right)
  Array[i++]=TempArray[index2++];
}
void MergeA(int Array[],int TempArray[],int left,int right,int middle)
{
 int index1,index2;
 int i,j,k;
 for(i=left;i<=middle;i++)
  TempArray[i]=Array[i];
 for(j=1;j<=right-middle;j++)
         TempArray[right-j+1]=Array[j+middle];
     for(index1=left,index2=right,k=left;k<=right;k++)
  {
   if(TempArray[index1],TempArray[index2])
    Array[k]=TempArray[index1++];
   else
    Array[k]=TempArray[index2--];
  }
}

void TwoWayMergeSorter(int Array[],int TempArray[],int left,int right)
{
 if(left<right)
 {
  int middle=(left+right)/2;
  TwoWayMergeSorter(Array,TempArray,left,middle);
  TwoWayMergeSorter(Array,TempArray,middle+1,right);
  MergeA(Array,TempArray,left,right,middle);
 }
}


//桶式排序

void BuckerSorter(int Array[],int n,int max)
{
 int *TempArray=new int[n];
 int * count=new int[max];
 int i;
 for(i=0;i<n;i++)
  TempArray[i]=Array[i];
 for(i=0;i<max;i++)
  count[i]=0;
 for(i=0;i<n;i++)
  count[Array[i]]++;
 for(i=1;i<max;i++)
  count[i]=count[i-1]+count[i];
 for(i=n-1;i>=0;i--)
  Array[--count[TempArray[i]]]=TempArray[i];
}
//基数排序
void RadixSorter(int Array[],int n,int d,int r)
{
 int *TempArray=new int[n];
 int *count=new int[r];
 int i,j,k;
 int Radix=1;
 for(i=1;i<=d;i++)
 {
  for(j=0;j<r;j++)
   count[j]=0;
  for(j=0;j<n;j++)
  {
   k=(Array[j]/Radix)%r;
   count[k]++;
  }
  for(j=1;j<r;j++)
   count[j]=count[j-1]+count[j];
  for(j=n-1;j>=0;j--)
  {
   k=(Array[j]/Radix)%r;
   count[k]--;
   TempArray[count[k]]=Array[j];
  }
  for(j=0;j<n;j++)
   Array[j]=TempArray[j];
  Radix*=r;
 }
}
//打印数据
void printArray(int Array[],int n)
{
 for(int i=0;i<n;i++)
  cout<<Array[i]<<" ";
 cout<<endl;
}

int main()
{
 int array[20],n=10;
 int sign=0,tempArray[20],max=100;
 int d=2,r=10;
 cout<<"Enter some numbar to sort:"<<endl;
 for(int i=0;i<n;i++)
 {
  cin>>array[i];
  tempArray[i]=0;
 }
 cout<<"输入你要选择的排序方法:"<<endl;
 cout<<"插入排序---1"<<"优化插入排序--2"<<"二分法插入排序---3"<<endl;
 cout<<"优化冒泡--4"<<"直接选择--5"<<"SHELL排序--6"<<endl;
 cout<<"优化的快速排序--7"<<"两路归并排序---8"<<"桶式排序----9"<<endl;
 cout<<"基数排序=====10"<<endl;
 cin>>sign;
 switch(sign)
 {
 case 1: InsertSort(array,n);break;
 case 2: ImprovedInertSorter(array,n);break;
 case 3: BinaryInsertSorter(array,n);break;
 case 4: ImprovedBubbleSorter(array,n);break;
 case 5: StraighSelectSorter(array,n);break;
 case 6: ShellSorter(array,n);break;
 case 7: ImprovedQuickSorter(array,0,n-1);break;
 case 8: TwoWayMergeSorter(array,tempArray,0,n-1);break;
 case 9: BuckerSorter(array,n,max);break;
 case 10: RadixSorter(array,n,d,r);break;
 default:break;
 }
 cout<<"排序的结果是:"<<endl;
 printArray(array,n);
 return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值