三种排序

/*

一:最快最简单的排序——桶排序(此处并不是真正的桶排序)

缺点:时间复杂度高

代码:

#include<stdio.h>
#include<string.h>

int main(void)
{
    int book[1001], i, j, n, x;

    scanf("%d", &n);
    memset(book, 0, sizeof(book)); //初始化为零

    for(i = 0; i < n; i++)
    {
        scanf("%d", &x); //把每一个数读到变量x中

        book[x]++; //进行计数
    }

    for(i = 1; i <= 1001; i++)  //这里的数组不可以开的太大,要不然就会变成无限循环
    {
        for(j = 0; j < book[i]; j++)  //出现了几次打印几次
        {
            printf("%d ", i);
        }
    }

    getchar();
    getchar();

    /*这里的getchar();用来暂停程序,以便查看代码输出的内容
    也可以用system(“pause”);等来代替*/

    return 0;
}

*/

/*

二:冒泡排序

缺点:申请的空间大

基本思想:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来,核心是双重嵌套循环

#include<stdio.h>

int main(void)
{
    int i, j, n, t, a[1001];

    scanf("%d", &n);

    for(i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }

    for(i = 0; i < n - 1; i++)
    {
        for(j = 0; j < n - i - 1; j++)
        {
            if(a[j] < a[j + 1])
            {
                t = a[j], a[j] = a[j + 1], a[j + 1] = t;
            }
        }
    }

    for(i = 0; i < n; i++)
    {
        printf("%d%c", a[i], i == n - 1?'\n':' ');
    }

    return 0;
}
 

*/

/*

三:快速排序

优点:解决了浪费空间以及执行效率问题

代码:

#include<stdio.h>

void sqort(int a[], int left, int right)
{
    int i = left, j = right, key;

    key = a[left];

    while(i >= j)
    {
        return ;
    }

    while(i < j)
    {
        while(i < j && a[j] >= key)
        {
            j--;
        }

        a[i] = a[j];

        while(i < j && a[i] <= key)
        {
            i++;
        }

        a[j] = a[i];

    }

    a[i] = key;

    sqort(a, left, i - 1);
    sqort(a, i + 1, right);

}

int main(void)
{
    int a[1001], i, n;

    scanf("%d", &n);

    for(i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }

    sqort(a, 0, n - 1);

    for(i = 0; i < n; i++)
    {
        printf("%d%c", a[i], i == n - 1?'\n':' ');
    }

    return 0;
}
 

*/

/*练习题:排序加去重*/

代码:

/*去重和排序*/

#include<stdio.h>

void sqort(int a[], int left, int right)
{
   int i = left, j = right, key = a[left];

   while(i >= j)
   {
      return ;
   }

   while(i < j)
   {
       while(i < j && a[j] >= key)
       {
           j--;
       }

       a[i] = a[j];

       while(i < j && a[i] <= key)
       {
           i++;
       }

       a[j] = a[i];

   }

   a[i] = key;

   sqort(a, left, i - 1);
   sqort(a, i + 1, right);

}

int main(void)
{
    int i, n, a[1001], ans = 1;

    scanf("%d", &n);

    for(i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }

    sqort(a, 0, n - 1);

    printf("%d ", a[0]);

    for(i = 1; i < n; i++)
    {
        if(a[i] != a[i - 1])
        {
            printf("%d ", a[i]);
            ans++;
        }
    }

    printf("\n");
    printf("%d\n", ans);

    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/Eider1998/article/details/81101581