- sort排序,手写cmp函数
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
int cmp(int x,int y)
{
return x>y;
}
int main()
{
int a[]={3,2,1,4,5,3,2,6,8,6,4,2,4};
sort(a,a+13,cmp);
for(int i=0;i<13;i++)
printf("%d ",a[i]);
// sort()
return 0;
}
- 冒泡排序
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;int main()
{
int n,i,j,temp;
printf("输入总共有多少个数:\n");
scanf("%d",&n);
int *a=new int[n];
printf("请输入%d个数:\n",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=1;i<n;i++)
for(j=0;j<n-i;j++)
{
if(a[j]<a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
delete a;
return 0;
}
- K选择法排序
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;int main()
{
int n,i,j,temp,max,k;
printf("输入总共有多少个数:\n");
scanf("%d",&n);
int *a=new int[n];
printf("请输入%d个数:\n",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++)
{
max=a[i];k=i;
for(j=i;j<n;j++)
{
if(a[j]>max)
{
max=a[j];
k=j;
}
}
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
delete a;
return 0;
}
- 直接插入排序
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;int main()
{
int n,i,j,temp,max,k;
printf("输入总共有多少个数:\n");
scanf("%d",&n);
int *a=new int[n];
printf("请输入%d个数:\n",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=1;i<n;i++)
{
j=i;
while(j>0&&a[j]>a[j-1])
{
temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
j--;
}
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
delete a;
return 0;
}
- 折半插入排序
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;int main()
{
int n,i,j,temp,mid,low,high;
printf("输入总共有多少个数:\n");
scanf("%d",&n);
int *a=new int[n];
printf("请输入%d个数:\n",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=1;i<n;i++)
{
low=0;
high=i-1;
temp=a[i];
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]>=temp)
high=mid-1;
else
low=mid+1;
}
printf("low+high=%d-%d\n",low,high);
for(j=i;j>low;j--)
{
a[j]=a[j-1];
}
a[low]=temp;
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
delete a;
return 0;
}
- 希尔排序
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;int main()
{
int n,i,j,temp,mid,low,high,gap;
printf("输入总共有多少个数:\n");
scanf("%d",&n);
// gap=(n-1)/3;
// printf("步长为\n:\n",gap);
int *a=new int[n];
printf("请输入%d个数:\n",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(gap=n/2;gap>0;gap/=2)
{
for(i=gap;i<n;i++)
{
j=i;
while(j-gap>=0&&a[j]>a[j-gap])
{
a[j]=a[j]+a[j-gap];
a[j-gap]=a[j]-a[j-gap];
a[j]=a[j]-a[j-gap];
j-=gap;
}
}
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
delete a;
return 0;
}
- 快速排序
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
void qsort(int arr[],int x,int y)
{
int temp,left,right;
left=x;
right=y;
if(left<=right)
{
temp=arr[left];
while(left<right)
{
while(left<right&&arr[right]>=temp)
right--;
arr[left]=arr[right];
while(left<right&&arr[left]<=temp)
left++;
arr[right]=arr[left];
}
arr[right]=temp;
qsort(arr,x,left-1);
qsort(arr,right+1,y);
}
}
int main()
{
int n,i,j,temp,mid,low,high;
printf("输入总共有多少个数:\n");
scanf("%d",&n);
int *a=new int[n];
printf("请输入%d个数:\n",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
qsort(a,0,n-1);
for(i=0;i<n;i++)
printf("%d ",a[i]);
delete a;
return 0;
}
- 堆排序
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;void percDown(int arr[],int i,int N)
{
int child,tmp;
for(tmp=arr[i];2*i+1<N;i=child)
{
child=2*i+1;
if(child!=N-1&&arr[child+1]<arr[child])
child++;
if(tmp>arr[child])
arr[i]=arr[child];
else
break;
}
arr[i]=tmp;
}void heapSort(int arr[],int num)
{
int i;
for(i=num/2-1;i>=0;i--)
{
percDown(arr,i,num);
}
for(i=num-1;i>0;i--)
{
arr[0]=arr[0]+arr[i];
arr[i]=arr[0]-arr[i];
arr[0]=arr[0]-arr[i];
percDown(arr,0,i);
}
}int main()
{
int n,i,j,temp,mid,low,high;
printf("输入总共有多少个数:\n");
scanf("%d",&n);
int *a=new int[n];
printf("请输入%d个数:\n",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
heapSort(a,n);
for(i=0;i<n;i++)
printf("%d ",a[i]);
delete a;
return 0;
}
- 归并排序
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;void merge(int a[],int low,int mid,int high,int temp[])
{
int i,j,k;
i=low;
j=mid+1;
k=low;
while(i<=mid&&j<=high)
{
if(a[i]<a[j])
{
temp[k++]=a[i++];
}
else
{
temp[k++]=a[j++];
}
}
while(i<=mid)
{
temp[k++]=a[i++];
}
while(j<=high)
{
temp[k++]=a[j++];
}
for(i=low;i<=high;i++)
a[i]=temp[i];
}void mergeSort(int a[],int low,int high,int b[])
{
if(low<high)
{
int mid=(low+high)/2;
mergeSort(a,low,mid,b);
mergeSort(a,mid+1,high,b);
merge(a,low,mid,high,b);
}
}
int main()
{
int n,i;
printf("输入总共有多少个数:\n");
scanf("%d",&n);
int *a=new int[n];
int *b=new int[n];
//int *temp = (int*)malloc(sizeof(int)*len);
printf("请输入%d个数:\n",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
mergeSort(a,0,n-1,b);
for(i=0;i<n;i++)
printf("%d ",a[i]);
delete a;
return 0;
}