在做很多题目时都会用到排序,先把我遇到过的排序整理一下
冒泡排序:
接触的第一种排序方法
从第一个元素起,开始两两比较,结束之后,最大的数在数组的末尾
一共需要比较n-1次,外循环为n-1,内循环次数随外循环改变,n-1-i
#include<stdio.h>int main(){ int a[1001]; int i,j,n,t; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=1;i<=n-1;i++) for(j=0;j<=n-i-1;j++) { if(a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } for(i=0;i<n;i++) printf("%d ",a[i]); return 0;}
选择排序:
将最小的数放在前面,然后将a[0]与a[1]比较,由小到大排序,将a[1]与a[2]比较,从小到大排序,……,将a[n]与a[n-1]比较,从小到大排序;再从剩余的n-1个数中选择最小的放在a[1]的位置,以此类推。
#include<stdio.h>int main(){ int a[1001]; int i,j,n,t; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) { if(a[i]>a[j]) { t=a[i]; a[i]=a[j]; a[j]=t; } } for(i=0;i<n;i++) printf("%d ",a[i]); return 0;}
简化版桶排序:
这只是可以满足比较简单的排序的简化版
依次判断桶的编号,出现了几次就打印几次。每出现一个数,对应编号的桶+1
#include<stdio.h>int main(){ int a[1001]; int i,j,t,n; for(i=0;i<1000;i++) a[i]=0; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&t); a[t]++; } for(i=1;i<1000;i++) for(j=1;j<=a[i];j++) printf("%d ",i); return 0;}
快速排序:
设置一个基准数,将比基准数小的数放左边,比基准数大的数放在其右边
#include<stdio.h>int a[101],n;void quicksort(int left,int right){ int i,j,temp,t; if(left>right) return ; temp=a[left]; i=left; j=right; while(i!=j) { while(a[j]>=temp&&i<j) 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; quicksort(left,i-1); quicksort(i+1,right);}int main(){ int i; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); quicksort(1,n); for(i=1;i<=n;i++) printf("%d ",a[i]); return 0;}
冒泡排序是将最大的数先放后面;选择排序是将最小的数先放前面;简化版桶排序是每出现一个数,就将对应编号的桶内+1;快速排序需要设置基准点
转载于:https://www.cnblogs.com/AquamarineOnly/p/5587870.html