数据排序
桶排序
void In_Solve() { scanf("%d",&n); FORa(i,1,n) scanf("%d",&a),b[a]++; //浪费空间比较大,多一个数组的花费 FORa(i,1,N) while(b[i]--) printf("%d ",i); }
选择排序
void Solve() { FORa(i,1,n) FORa(j,i+1,n) if(a[i]>a[j])//从第一个开始,依次与后面的开始比较,不符合就换,直到比到第N个 swap(a[i],a[j]); FORa(i,1,n) printf("%d ",a[i]); }
冒泡排序
void Solve() { FORa(i,2,n) FORa(j,i,n) if(a[j-1]>a[j])//从第一个开始,邻接两个开始比较,不符合就换,直到比到第N个
swap(a[j-1],a[j]); FORa(i,1,n) printf("%d ",a[i]); }
插入排序
oid Solve() { int fa; scanf("%d",&n); FORa(i,1,n) { scanf("%d",&fa); bool f=1; FORa(j,1,i-1) { if(fa<=a[j]) //找到适合的位置 { FORs(k,i,j) a[k+1]=a[k];//将不符合的往后都挪一个,腾出一个空间,注意:需要从后往前处理,不然数据可能会错误刷新 a[j]=fa,f=0;//插入,记得标记 break;//尽可能降低时间复杂度 } } if(f) a[i]=fa;//没有插入队伍中,则直接跟上队尾 } FORa(i,1,n) printf("%d ",a[i]); }
快速排序
void sort(int l,int r) { int i=l,j=r,mid=a[(l+r)/2];//确定基准数 do{ while(a[i]<mid) i++;//从左往右找到一个大于基准数的的 while(a[j]>mid) j--;//从右往左找到一个小于基准数的 if(i<=j) swap(a[i],a[j]),i++,j--;//如果符合定位(基准数)的要求,则交换两者 }while(i<=j);//符合定位循环 if(l<j) sort(l,j);//处理左区间 if(i<r) sort(i,r);//处理右区间 }
归并排序
void sort(int l,int r) { if(l==r) return;//一定要记得写,分治的bottom int mid=(l+r)/2,i=l,j=mid+1,k=l; sort(l,mid),sort(mid+1,r);//处理左右两个区间,使其有序 while(i<=mid&&j<=r) { if(a[i]<=a[j]) b[k++]=a[i++]; else b[k++]=a[j++],ans+=mid-i+1; } while(i<=mid) b[k++]=a[i++];//处理剩余的部分 while(j<=r) b[k++]=a[j++];//将a中l-r这段区域进行排序结果储存在b数组中 FORa(i,l,r) a[i]=b[i];//将b的结果反馈给a }