你值得拥有的排序算法,冒泡、快排、桶排序
冒泡排序的核心思想就是,每一轮都会选出一个最大的到最右边,这样经过n-1轮之后,就把n-1个大的放到了右边,也就是达到了升序的排序,这个算法的时间复杂度是n*n。
void bubbleSort(int a[],int n) {int i, j, temp;for (i = 0; i < n-1; i ++) {for (j = 0; j < n - i - 1; j ++) {if (a[j] > a[j + 1]) {temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;}}}}int main() {int a[] = {4,6,7,3,2,5,8,2,1,9};int i, n = 10;bubbleSort(a,n);for (i = 0; i < n; i ++) {printf("%d ",a[i]);}printf("\n");return 0;}
快排算是对冒泡的一个升级,其核心思想就是,找一个基准,达到基准右边的都比基准大,其左边的都比基准小,实现方式为,从右向左遍历 j,直到比基准小了停止,然后从左往右遍历 i,直到比基准大了停止,然后 a[i]和a[j]互换位置,重复操作,直到 i 和 j 相等了,此时a[i] 一定是小于等于基准的(如果这个你想清楚了,我觉得你可以手写快排了),然后交换基准和a[i]的位置,这就实现了基准左边都是小于基准的,基准右边都是大于基准的。
void quickSort(int a[],int left,int right) {int i, j, temp;i = left;j = right;if (i >= j) {return;}while (i < j) {while (i < j && a[j] >= a[left]) {j --;}while (i < j && a[i] <= a[left]) {i ++;}temp = a[i];a[i] = a[j];a[j] = temp;}temp = a[i];a[i] = a[left];a[left] = temp;quickSort(a,left,i - 1);quickSort(a,i + 1,right);}int main() {int a[] = {3,5,6,7,2,4,7,9,3,8};int i, n = 10;quickSort(a,0,n - 1);for (i = 0; i < n; i ++) {printf("%d ",a[i]);}printf("\n");return 0;}
桶排序时间复杂度取决于数据范围的最大值
const int inf=1e9;int a[110];int main(){int n,i,t,maxn;scanf("%d",&n);maxn=-inf;for(i=0;i<n;i++){scanf("%d",&t);a[t]++;if(t>maxn)maxn=t;}for(i=0;i<=maxn;i++){while(a[i]>0)//可对有重复的元素排序{printf("%d ",i);a[i]--;}}return 0;}
其可以优化,也就是在找最大值的时候顺便找一个最小值,然后把最小值当做0,其他元素均减小一个最小值
const int inf=1e9;int a[110];int b[110];int main(){int n,i,t,minn,maxn;scanf("%d",&n);minn=inf;maxn=-inf;for(i=0;i<n;i++){scanf("%d",&a[i]);if(a[i]>maxn)maxn=a[i];if(a[i]<minn)minn=a[i];}for(i=0;i<n;i++)b[a[i]-minn]++;for(i=0;i<=maxn-minn;i++){while(b[i]>0)//可对有重复的元素排序{printf("%d ",i+minn);b[i]--;}}return 0;}
如果感觉有收获,记得点一下右下角在看哦
