• 【排序】基数排序(计数排序、桶排序)


    在此对于桶排序做出两种方法:

    一.简化版桶排序

    代码例如以下:

    <span style="font-size:18px;">/*简化版的桶排序*/
    
    #include <stdio.h>
    int main()
    {
    	int book[1001],i,j,t,n;
    	for(i=0;i<=1000;i++)
    	{
    		book[i]=0;
    	}
    	scanf("%d",&n);//输入一个数n。表示接下来有n个数
    	for(i=1;i<=n;i++)//循环读入n个数。并进行桶排序
    	{
    		scanf("%d",&t); //把每个数读到变量t中
    		book[t]++; //进行计数,对编号为t的桶放一个小旗子
    	}
    	for(i=0;i<=1000;i++) //依次推断编号1000~0的桶
    	{
    		for(j=1;j<=book[i];j++) //出现了几次就将桶的编号打印几次
    		{
    			printf("%d ",i);
    		}
    		getchar();
    	}
    	getchar();
    	return 0;
    }</span>


    二.完整版桶排序

    基数排序(有MSD和LSD)

    如今先实现最简单的基数排序。就是对数字仅仅有从小到大排序,没有类别之分。


    基数排序的思想就是:先对个位数字进行排序,排序完毕之后,统计成堆
                                            接着对上面排好序的十位数字进行排序。排序完毕之后,再进行对排好序的百位数字排序,依次类推

    函数加測试代码例如以下:

    /*完整版桶排序*/
    #include <iostream>
    #include <list>
    using namespace std;
    
    #define RADIX 10
    
    /**
     * 基树排序(有MSD和LSD)
     * 如今先实现最简单的基数排序,就是对数字仅仅有从小到大排序。没有类别之分
     * 基数排序的思想就是:
     * 先对个位数字进行排序。排序完毕之后。统计成堆
     * 接着对上面排好序的十位数字进行排序,排序完毕之后,再进行对
     * 排好序的百位数字排序,一次类推
    */
    
    void RadixSort(int arr[],int n)
    {
    	for(int m = 0;m < RADIX;m++)                 //创建RADIX个链表   
    	{
            //还是採用list作为桶
            list<int> *lists = new list<int>[RADIX];	
            for(int i = 0;i < n;i++)                 
    		{
                int temp = arr[i];
    			int loc = 1;
                for(int t = 1;t < m;t++)
    			{
                    loc *= 10;
                }
                lists[(temp/loc%10)].push_back(arr[i]);//数值同样的插入到等值链表中
            }
            int j = 0;                                 //合并RADIX个链表
            for(i = 0;i < 10;i++)
    		{
    			
                if(lists[i].size() != 0)
    			{
                    list<int>::iterator it = lists[i].begin();
    				
                    while(it != lists[i].end())
    				{
                        arr[j] = *it;
                        it++;
                        j++;
                    }
                }
            }
        }
    }
    
    void main()
    {
    	int arr[] = {278,109,63,930,589,184,505,269,8,83};
    	for(int i = 0;i < sizeof(arr)/sizeof(int);++i)
    	{
    		cout<<arr[i]<<" ";
    	}
    	cout<<endl;
    	RadixSort(arr,sizeof(arr)/sizeof(int));
    	for(i = 0;i < sizeof(arr)/sizeof(int);++i)
    	{
    		cout<<arr[i]<<" ";
    	}
    	cout<<endl;
    }
    


    执行结果例如以下图:




    十分期待大家对于我的批评和建议~谢谢大家

  • 相关阅读:
    20145313《信息安全系统设计基础》第0周学习总结
    20145313张雪纯课程总结
    RocEDU.阅读.写作《苏菲的世界》书摘(七)
    RocEDU.阅读.写作《苏菲的世界》书摘(六)
    20145310《信息安全系统设计基础》课程总结
    20145310 《信息安全系统设计基础》第五周同学问题总结
    20145310《信息安全系统设计基础》第十四周学习总结
    20145310《信息安全系统设计基础》第十三周学习总结
    20145310《信息安全系统设计基础》实验五 网络通信
    20145310《信息安全系统设计基础》实验四 外设驱动程序设计
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/6820983.html
Copyright © 2020-2023  润新知