首先放上啊哈算法中的快排算法
#include <stdio.h> int a[100010],n; void quick(int left,int right) { int temp,i,j,t; temp=a[left];//temp存的就是基准数 if(left>right) { return ; } i=left;j=right; while(i!=j) {
while(a[j]>=temp&&i<j)//顺序很重要,要从右往左找(因为基准数是最左边,与i对换) { j--; }
while(a[i]<=temp&&i<j) { i++; } if(i<j)//交换两个数中的位置 { t=a[i]; a[i]=a[j]; a[j]=t; } } a[left]=a[i];//最终将基准数归位 a[i]=temp; quick(left,i-1); quick(i+1,right); } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } quick(1,n); for(int i=1;i<=n;i++) { printf("%d\n",a[i]); } return 0; }
这是一种以第一个数作为基准数的情况,还有将中间数作为基准数的实例
#include<stdio.h> #include<stdlib.h> void QuickSort(int *A,int left,int right) { if(left>=right) return; int x=A[(left+right)>>1],low=left,high=right; while(low<high) { while(A[low]<x) low++; while(A[high]>x) high--; if(low<=high) { int Temp=A[low]; A[low]=A[high]; A[high]=Temp; low++; high--; } } QuickSort(A,left,high); QuickSort(A,low,right); } int main() { int length,i,r[10000]; scanf("%d",&length); for(i=1;i<=length;i++) scanf("%d",&r[i]); QuickSort(r,1,length); for(i=1;i<=length;i++) printf(" %d",r[i]); printf("\n"); system("pause"); return 0; }
感觉这个也是一个不错的代码
关于qsort函数
头文件stdlib.h头函数里面
void qsort(s,n,sizeof(s[0]),cmp);
s是表示数组名,n是表示要排序的个数,后面的随之对应,最后要下一个排序函数
最常见的对int型数组排序或者字符
对于double#include<stdio.h> #include<stdlib.h> int s[10000],n,i; int cmp(const void *a, const void *b) { return(*(int *)a-*(int *)b); //升序 //return(*(int *)b-*(int *)a); //降序 } int main() { scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&s[i]); qsort(s,n,sizeof(s[0]),cmp); for(i=0;i<n;i++) printf("%d ",s[i]); printf("\n"); system("pause"); return 0; }
#include<stdio.h> #include<stdlib.h> double s[1000]; int i,n; int cmp(const void * a, const void * b) { return((*(double*)a-*(double*)b>0)?1:-1); } int main() { scanf("%d",&n); for(i=0;i<n;i++) scanf("%lf",&s[i]); qsort(s,n,sizeof(s[0]),cmp); for(i=0;i<n;i++) printf("%.2lf ",s[i]); printf("\n"); system("pause"); return(0); }
这里做个注释,本来是因为要判断如果a==b返回0的,但是严格来说,两个double数是不可能相等的,只能说fabs(a-b)<1e-20之类的这样来判断,所以这里只返回了1和-1
对于结构体,以及排序
#include<stdio.h>
#include<stdlib.h> struct node { double data; int no; } s[100]; int i,n; int cmp(const void *a,const void *b) { struct node *aa=(node *)a; struct node *bb=(node *)b; return(((aa->data)>(bb->data))?1:-1); } int main() { scanf("%d",&n); for(i=0;i<n;i++) { s[i].no=i+1; scanf("%lf",&s[i].data); } qsort(s,n,sizeof(s[0]),cmp); for(i=0;i<n;i++) printf("%d %lf\n",s[i].no,s[i].data); system("pause"); return 0; }
二级结构体
#include<stdio.h>
#include<stdlib.h> struct node { double data; int no; } s[100]; int i,n; int cmp(const void *a,const void *b) { struct node *aa=(node *)a; struct node *bb=(node *)b; if(aa->data!=bb->data) return(((aa->data)>(bb->data))?1:-1); else return((aa->no)-(bb->no)); } int main() { scanf("%d",&n); for(i=0;i<n;i++) { s[i].no=i+1; scanf("%lf",&s[i].data); } qsort(s,n,sizeof(s[0]),cmp); for(i=0;i<n;i++) printf("%d %lf\n",s[i].no,s[i].data); printf("\n"); system("pause"); return 0; }