• 排序算法--基数排序


    #define _CRT_SECURE_NO_WARNINGS
    
    #include<math.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int findMaxNum(int *p, int n);
    void sort2(int *p, int n, int loop);
    void bucketSort3(int *p, int n);
    int getLoopTimes(int num);
    /*
    基数排序原理:
    求出数组中最大值
    求出最大值的位数,作为循环轮次;
    第一轮:按照个位排序
    第二轮:按照十位排序
    ……
    直到最高位
    */
    testBS()
    {
    	int a[] = { 2, 343, 342, 1, 123, 43, 4343,3, 433, 687, 654, 3 };
    	int size = sizeof(a) / sizeof(int);
    	//基数排序
    	bucketSort3(a, size);
    	//打印排序后结果
    	int i;
    	for (i = 0; i < size; i++)
    	{
    		printf("%d
    ", a[i]);
    	}
    
    }
    //基数排序
    void bucketSort3(int *p, int n)
    {
    	//获取数组中的最大数
    	int maxNum = findMaxNum(p, n);
    	//获取最大数的位数,次数也是再分配的次数。
    	int loopTimes = getLoopTimes(maxNum);
    	int i;
    	//对每一位进行桶分配
    	for (i = 1; i <= loopTimes; i++)
    	{
    		sort2(p, n, i);
    	}
    }
    //获取数字的位数
    int getLoopTimes(int num)
    {
    	int count = 1;
    	int temp = num / 10;
    	while (temp != 0)
    	{
    		count++;
    		temp = temp / 10;
    	}
    	return count;
    }
    //查询数组中的最大数
    int findMaxNum(int *p, int n)
    {
    	int i;
    	int max = 0;
    	for (i = 0; i < n; i++)
    	{
    		if (*(p + i) > max)
    		{
    			max = *(p + i);
    		}
    	}
    	return max;
    }
    //将数字分配到各自的桶中,然后按照桶的顺序输出排序结果
    void sort2(int *p, int n, int loop)
    {
    	//建立一组桶此处的20是预设的根据实际数情况修改
    	int buckets[10][12] = {0};
    	//求桶的index的除数
    	//如798个位桶index=(798/1)%10=8
    	//十位桶index=(798/10)%10=9
    	//百位桶index=(798/100)%10=7
    	//tempNum为上式中的1、10、100
    	int tempNum = (int)pow(10, loop - 1);
    	int i, j;
    	for (i = 0; i < n; i++)
    	{
    		int row_index = (*(p + i) / tempNum) % 10;
    		for (j = 0; j < 12; j++)
    		{
    			if (buckets[row_index][j] == 0)
    			{
    				buckets[row_index][j] = *(p + i);
    				break;
    			}
    		}
    	}
    	//将桶中的数,倒回到原有数组中
    	int k = 0;
    	for (i = 0; i < 10; i++)
    	{
    		for (j = 0; j < 12; j++)
    		{
    			if (buckets[i][j] != 0)
    			{
    				*(p + k) = buckets[i][j];
    				buckets[i][j] = 0;
    				k++;
    			}
    		}
    	}
    }
    
    int main()
    {
    	testBS();
    
    	system("pause");
    }
    

    整理自:

    http://baike.baidu.com/link?url=lRiY45uggf5cxgOJ7CvvetViKimz4OphF1AwwEfYX8lLA1DdkC-lIhTs7jggaV1WkwvTTzLC9kdP5m4U4GzyokfdDDy_H_lmt0XUpPskspbhLSzw_KlkM33-cRdpUFOC

  • 相关阅读:
    $route 侦听路由参数的变化
    vue移动端(持续更新......)
    vue本地开发配置及项目部署
    vue解决虚拟dom复用的问题
    移动端头部固定中间内容滚动
    VUE的路由懒加载及组件懒加载
    VUEX(状态管理)之憨憨篇
    Go-第一篇
    高精度1
    牛客练习赛61
  • 原文地址:https://www.cnblogs.com/my-cat/p/5968956.html
Copyright © 2020-2023  润新知