C++6种基础排序可直接运行(归并、堆排、快排、冒泡、选择、插入)
冒泡
int maopao(int *num,int n)
{
int i,j;
int temp;
for(i=0;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(num[j]>num[j+1])
{
temp=num[j];
num[j]=num[j+1];
num[j+1]=temp;
}
}
}
return 0;
}
选择排序
int xuanze(int*num,int n)
{
int i,j;
int min;
for(i=0;i<n-1;i++)
{
min=i;
for(j=i+1;j<n;j++)
{
if(num[j]<num[min])
{
min=j;
}
}
if(min != i)
{
int temp=num[min];
num[min]=num[i];
num[i]=temp;
}
}
return 0;
}
插入排序
int charu(int *num,int n)
{
int i,j;
int temp;
for(i=1;i<n;i++)
{
temp=num[i];
for(j=i;j>0&&temp<num[j-1];j--)
{
num[j]=num[j-1];
}
num[j]=temp;
}
return 0;
}
快速排序
int kuaipai(int *num, int low, int high)
{
int i=low,j=high;
int pivot=num[low];
if(low==high)
{
return 0;
}
while(i<j)
{
while(j>i && num[j]>pivot)
{
j--;
}
num[i]=num[j];
while(i<j && num[i]<pivot)
{
i++;
}
num[j]=num[i];
}
num[i]=pivot;
kuaipai(num,low,i);
kuaipai(num,i+1,high);
return 0;
}
堆排序
int duitiaozheng(int *num,int start,int end)
{
int temp=num[start];
int i;
for(i=2*start+1;i<=end;i=i*2+1)
{
if(num[i]<num[i+1] && i<end)
{
i++;
}
if(temp>=num[i])
{
break;
}
num[start]=num[i];
start=i;
}
num[start]=temp;
return 0;
}
int duipai(int *num,int n)
{
int i;
int temp;
for(i=n/2-1;i>=0;i--)
{
duitiaozheng(num,i,n-1);
}
for(i=n-1;i>0;i--)
{
temp=num[0];
num[0]=num[i];
num[i]=temp;
duitiaozheng(num,0,i-1);
}
return 0;
}
归并排序
int guibing(int *num,int *p,int low,int high)
{
if(low==high)
{
return 0;
}
int mid=low+((high-low)>>1);
int i=low,j=mid+1,pos=low;
guibing(num,p,low,mid);
guibing(num,p,mid+1,high);
while(i<=mid && j<=high)
{
if(num[i]<=num[j]) p[pos++]=num[i++];
else p[pos++]=num[j++];
}
while(i <= mid) p[pos++]=num[i++];
while(j <= high) p[pos++]=num[j++];
while(low<=high)
{
num[low]=p[low];
low++;
}
return 0;
}
int guibingpaixu(int *num,int n)
{
int *p=new int[n];
guibing(num,p,0,n-1);
delete[] p;
return 0;
}
全部代码(main函数中选择对应函数可运行)
#include <iostream>
using namespace std;
int num_print(int *,int);
int maopao(int *num,int n)
{
int i,j;
int temp;
for(i=0;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(num[j]>num[j+1])
{
temp=num[j];
num[j]=num[j+1];
num[j+1]=temp;
}
}
}
return 0;
}
int xuanze(int*num,int n)
{
int i,j;
int min;
for(i=0;i<n-1;i++)
{
min=i;
for(j=i+1;j<n;j++)
{
if(num[j]<num[min])
{
min=j;
}
}
if(min != i)
{
int temp=num[min];
num[min]=num[i];
num[i]=temp;
}
}
return 0;
}
int charu(int *num,int n)
{
int i,j;
int temp;
for(i=1;i<n;i++)
{
temp=num[i];
for(j=i;j>0&&temp<num[j-1];j--)
{
num[j]=num[j-1];
}
num[j]=temp;
}
return 0;
}
int kuaipai(int *num, int low, int high)
{
int i=low,j=high;
int pivot=num[low];
if(low==high)
{
return 0;
}
while(i<j)
{
while(j>i && num[j]>pivot)
{
j--;
}
num[i]=num[j];
while(i<j && num[i]<pivot)
{
i++;
}
num[j]=num[i];
}
num[i]=pivot;
kuaipai(num,low,i);
kuaipai(num,i+1,high);
return 0;
}
int duitiaozheng(int *num,int start,int end)
{
int temp=num[start];
int i;
for(i=2*start+1;i<=end;i=i*2+1)
{
if(num[i]<num[i+1] && i<end)
{
i++;
}
if(temp>=num[i])
{
break;
}
num[start]=num[i];
start=i;
}
num[start]=temp;
return 0;
}
int duipai(int *num,int n)
{
int i;
int temp;
for(i=n/2-1;i>=0;i--)
{
duitiaozheng(num,i,n-1);
}
for(i=n-1;i>0;i--)
{
temp=num[0];
num[0]=num[i];
num[i]=temp;
duitiaozheng(num,0,i-1);
}
return 0;
}
int guibing(int *num,int *p,int low,int high)
{
if(low==high)
{
return 0;
}
int mid=low+((high-low)>>1);
int i=low,j=mid+1,pos=low;
guibing(num,p,low,mid);
guibing(num,p,mid+1,high);
while(i<=mid && j<=high)
{
if(num[i]<=num[j]) p[pos++]=num[i++];
else p[pos++]=num[j++];
}
while(i <= mid) p[pos++]=num[i++];
while(j <= high) p[pos++]=num[j++];
while(low<=high)
{
num[low]=p[low];
low++;
}
return 0;
}
int guibingpaixu(int *num,int n)
{
int *p=new int[n];
guibing(num,p,0,n-1);
delete[] p;
return 0;
}
int num_print(int *num,int n)
{
int i=0;
for(;i<n;i++)
{
cout<<num[i]<<endl;
}
return 0;
}
int main()
{
int num[]={3,7,1,4,2,6,8,5,9};
int n=sizeof(num)/sizeof(num[0]);
guibingpaixu(num,n);
num_print(num,n);
return 0;
}