排序算法:n个0~1000之间的整数,将他们从大到小排序

上榜理由:

        如果没见过这种排序题,可能首先想到的就是常用的排序算法,比如快速排序,归并排序,那如果输入的n足够大,时间复杂度肯定比较高。其实题目0-1000的范围是一个题眼,所以一定有更优的排序算法:这里用到了桶排序!

回顾经典排序算法有

  • 冒泡排序(Bubble Sort)
  • 插入排序(Insertion Sort)
  • 希尔排序(Shell Sort)
  • 选择排序(Selection Sort)
  • 快速排序(Quick Sort)
  • 归并排序(Merge Sort)
  • 堆排序(Heap Sort)
  • 计数排序(Counting Sort)
  • 桶排序(Bucket Sort)

思路就是:

首先,0-1000的值域,创建1001个桶,每个桶都对应一个index,里面放一个初始值count=0,表示大小是index的数出现的个数。

然后遍历n个数,就把这1001个桶里的count更新一次,

接着再根据要求从大到小,或者从下到大遍历1001个桶,如果count>0,表示出现过count,就打印count个对应桶index的值,

最后,就完成了排序算法输出!

    //bucket_sort.cpp
	
    #include 
	#include 
	int main()
	{
	    int bucket[1001],i,j,t,n;
	    memset(bucket,0,sizeof bucket);
	    printf("please enter total number = \n");
	    scanf("%d",&n);//输入一个数n,表示接下来有n个数
	    printf("now please enter the data\n");
	    for(i=1;i<=n;i++)//循环读入n个数,并进行桶排序
	    {
	        scanf("%d",&t);  //把每一个数读到变量t中
	        bucket[t]++;  //进行计数,对编号为t的桶放一个小旗子
	    }
	    printf("sort data is: \n");
	    for(i=1000;i>=0;i--)  //依次判断编号1000~0的桶
	        for(j=1;j<=bucket[i];j++)  //出现了几次就将桶的编号打印几次
	             printf("%d ",i);
	             
	    printf("\n");
	    return 0;
	}

附个编译代码和输出测试

gcc -o test bucket_sort.cpp

./test

排序算法:n个0~1000之间的整数,将他们从大到小排序_第1张图片

你可能感兴趣的:(灵光一现的编程题,排序算法,算法,桶排序,leetcode)