vlambda博客
学习文章列表

你值得拥有的排序算法,冒泡、快排、桶排序

冒泡排序的核心思想就是,每一轮都会选出一个最大的到最右边,这样经过n-1轮之后,就把n-1个大的放到了右边,也就是达到了升序的排序,这个算法的时间复杂度是n*n。

#include<stdio.h>
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]的位置,这就实现了基准左边都是小于基准的,基准右边都是大于基准的。

#include <stdio.h>
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;}

桶排序时间复杂度取决于数据范围的最大值

#include<stdio.h>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,其他元素均减小一个最小值

#include<stdio.h>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;}


如果感觉有收获,记得点一下右下角在看哦