排序算法:桶排序、冒泡排序、快速排序(二分法排序)

一、桶排序(升序版)

//实现对一组数据的升序排序
#include<stdio.h>
int main()
{
    int a[1001] = {0}, i, j, t, n;
    scanf("%d", &n);
    for(i = 1; i <= n; i ++)//依次输入n个数
    {
        scanf("%d", &t);
        a[t] ++;//进行计数
    }
    for(i = 1000; i >= 0; i --)
    {
        for(j = 1; j <= a[i]; j ++)
        {
            printf("%d ", i);
        }
    }
    return 0;
}

该算法时间复杂度为 O(M+N),但非常浪费空间

 二、冒泡排序

#include<stdio.h>
int main()
{
    int a[101], i, j, t, n;
    scanf("%d", &n);//表示接下来有n个数
    for(i = 0; i < n; i ++)
    {
        scanf("%d", &a[i]);
    }
    //冒泡排序的核心部分,双重for循环
    for(i = 0; i < n-1; i ++)
    {
        for(j = i + 1; j < n; j ++)
        {
            if(a[j] > a[i])
            {
                t = a[j];
                a[j] = a[i];
                a[i] = t;
            }
        }
    }
    for(i = 0; i < n; i ++)
    {
        printf("%d ", a[i]);
    }
    return 0;
}

 空间利用率高了,但是时间复杂度为 O(N^2)

三、快速排序

#include<stdio.h>
int a[101], n;

void quicksort(int left, int right)
{
    int i, j, t, temp;
    if(left > right) return;
    temp = a[left];//temp中存的基准数
    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);//继续处理右边的,递归
    return;
}

int main()
{
    int i, j;
    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;
}

 最差的时间复杂度和冒泡排序一样O(N^2).

四、去重和排序

//方法一:使用桶排序,直接去重
#include<stdio.h>
int main()
{
    int a[1001] = {0}, i, n, t;
    scanf("%d", &n);
    for(i = 1; i <= n; i ++)
    {
        scanf("%d", &t);//把每一个数读到变量t中
        a[t] = 1;//标记出现过的数字
    }
    for(i = 1; i <= 1000; i ++)
    {
        if(a[i] == 1)
            printf("%d ", i);
    }
    return 0;
}

该程序的时间复杂度就是桶排序的时间复杂度

//方法二:先用冒泡排序或快速排序进行排序,再去重
#include<stdio.h>
int main()
{
    int a[101], n, i, j, t;
    scanf("%d", &n);
    for(i = 1; i <= n; i ++)
    {
        scanf("%d", &a[i]);
    }
    for(i = 1; i <= n-1; i ++)//先排序
    {
        for(j = 1; j<= n-i; j ++)
        {
            if(a[j] > a[j + 1])
            {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
        }
    }
    printf("%d ", a[1]);//输出第一个数
    for(i = 2; i <= n; i ++)
    {
        if(a[i] != a[i-1])
            printf("%d ", a[i]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_74776728/article/details/130489061
今日推荐