排序算法

217 阅读2分钟

一.排序

1.简化版的桶排序

1.1:方法:

根据数据的范围定义多个桶,例如数据的范围是1-1000,那么我们需要1001个桶,来表示0-1000之间每一个数出现的次数,另外,每一个桶的作用就是"标记"每个数出现的次数。

1.2:题目:对范围在1-1000内的整数进行排序

代码如下:

#include<stdio.h>
int main()
{
    int book[1001],i,j,t,n;
    for(i = 0;i <= 1000;i++)
    {
        book[i] = 0;
    }
    scanf("%d",&n);
    for(i = 1;i <= n;i++)
    {
        scanf("%d",&t);
        book[t]++;
    }
    for(i = 1000;i >= 0;i++)
    {
        for(j = 1;j <= book[i];j++)
        {
            printf("%d ",i);
        }
    }
}

2. 冒泡排序

1.1:方法

每次比较两个**相邻**的元素,如果他们的顺序错误就把他们交换.

2.2: 题目:对10个数进行从大到小排序

代码如下:

#include<stdio.h>
int main()
{
    int a[100],i,j,t,n;
    scanf("%d",&n);            //输入n,表示从键盘输入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;
            }
        }
    }
    for(i = 1;i <= n;i++)
    {
        printf("%d ",a[i]);
    }
    return 0;
}

2.3:总结

冒泡排序的核心是双重嵌套循环,且它的时间复杂度为O(N²),下面的快速排序可以更好的对数据进行排序。

3.快速排序

3.1:方法:

每次排序的时候先设置一个**基准点**,将小于等于基准点的数全部放到基准点的左边,大于等于基准点的数全部放到基准点的右边,这样相比于冒泡排序来说总的交换次数就变少了,速度就提高了。

3.2: 题目:对十个数进行从小到大排序

代码如下:

#include<stdio.h>
void quicksort(int left,int right)
{
    int i,j,t,temp;
    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);
    return;
}
int main()
{
    int a[101],n,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;
}

3.3 :图示

4.总结:

桶排序是最快的,同时占用更多的内存空间,冒泡排序的时间复杂度为O(N²),快速排序是最优的,它的时间复杂度为O(NlogN).