你值得拥有的排序算法,冒泡、快排、桶排序
冒泡排序的核心思想就是,每一轮都会选出一个最大的到最右边,这样经过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;
}
如果感觉有收获,记得点一下右下角在看哦