首页 > 其他分享 >十大经典排序之基数排序

十大经典排序之基数排序

时间:2024-03-25 20:59:18浏览次数:20  
标签:arr int 经典 bucket ++ BASE 基数排序 printf 排序

文章目录

概要

基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。

代码实现

#include<stdio.h>
#define MAX 20
//#define SHOWPASS
#define BASE 10

void print(int *a, int n) {
  int i;
  for (i = 0; i < n; i++) {
    printf("%d\t", a[i]);
  }
}

void radixsort(int *a, int n) {
  int i, b[MAX], m = a[0], exp = 1;

  for (i = 1; i < n; i++) {
    if (a[i] > m) {
      m = a[i];
    }
  }

  while (m / exp > 0) {
    int bucket[BASE] = { 0 };

    for (i = 0; i < n; i++) {
      bucket[(a[i] / exp) % BASE]++;
    }

    for (i = 1; i < BASE; i++) {
      bucket[i] += bucket[i - 1];
    }

    for (i = n - 1; i >= 0; i--) {
      b[--bucket[(a[i] / exp) % BASE]] = a[i];
    }

    for (i = 0; i < n; i++) {
      a[i] = b[i];
    }

    exp *= BASE;

#ifdef SHOWPASS
    printf("\nPASS   : ");
    print(a, n);
#endif
  }
}

int main() {
  int arr[MAX];
  int i, n;

  printf("Enter total elements (n <= %d) : ", MAX);
  scanf("%d", &n);
  n = n < MAX ? n : MAX;

  printf("Enter %d Elements : ", n);
  for (i = 0; i < n; i++) {
    scanf("%d", &arr[i]);
  }

  printf("\nARRAY  : ");
  print(&arr[0], n);

  radixsort(&arr[0], n);

  printf("\nSORTED : ");
  print(&arr[0], n);
  printf("\n");

  return 0;
}

小结

根据键值的每位数字来分配桶

标签:arr,int,经典,bucket,++,BASE,基数排序,printf,排序
From: https://blog.csdn.net/cui211472325/article/details/137025541

相关文章

  • 排序大乱炖
    目录一:插入排序1.1直接插入排序1.2希尔排序二:选择排序2.1选择排序2.2堆排序三:交换排序3.1冒泡排序3.2快速排序 3.2.1Hoare版本3.2.2双指针法 3.2.3非递归 一:插入排序1.1直接插入排序直接插入排序,可以有很多种写法,写法也比较简单,在这里,我主要介绍一种和希......
  • 五 505. 火柴排队 (归并排序|离散化)
    五505.火柴排队(归并排序|离散化)思路:先将两组数组按(2314->2013;3214->2103)规则排序,然后使用c数组建立双方的映射,从c[ai[i]]=bi[i],接着就是使用归并排序求c数组的逆序对即交换次数。importjava.util.*;publicclassMain{privatestaticint......
  • 学习笔记之算法快速排序
    快速排序听说有的公司面试会考?0.0快速排序思想:分治法基本思想:1、从数列中选出一个数2、分区(遍历),比它大的放他右边,比它小的或者等于的,放他左边3、对左右区间重复第2步,直到区间只有一个数(递归)参考:快速排序|菜鸟教程(runoob.com)在该网站......
  • 排序算法练习——最大间距:给定一个未排序的数组,找到排序后相邻元素之间的最大差值
    最大间距:给定一个未排序的数组,找到排序后相邻元素之间的最大差值。解决这个问题可以使用桶排序的思想。具体步骤如下:找到数组中的最大值和最小值。根据数组的长度,将数组划分成一定数量的桶,每个桶存放一定范围内的元素。计算每个桶内元素的最小值和最大值。遍历桶,计算相邻......
  • 排序算法练习——按照字符串的异位词分组:给定一个字符串数组,将所有异位词(字符相同但顺
    按照字符串的异位词分组:给定一个字符串数组,将所有异位词(字符相同但顺序不同的字符串)分组到同一个组中。要按照字符串的异位词分组,可以使用哈希表来将每个字符串排序后作为键,相同键的字符串即为异位词。以下是实现这个算法的Python代码:fromcollectionsimportdefaultdict......
  • 每日面经分享(测试开发经典场景题目)
    1.面试测试场景题目,回答的测试点有哪些?a.功能测试点:确保所测试的功能按照设计要求正常工作。例如,对于电影票预订网站的座位选择功能,测试点可能包括选择连续座位、选择非连续座位、座位已售等情况。b.边界测试点:测试输入值的边界情况,以验证系统在极限条件下的表现。例如......
  • drf : 过滤 排序 分页
    过滤和排序并不是所有的接口都需要写,查询所有才需要过滤(根据条件过滤),排序(按某个规则排序,也可倒序)。导入模块:"""OrderingFilter:排序SearchFilter:过滤"""fromrest_framework.filtersimportOrderingFilter,SearchFilter过滤,内置的过滤,必须继承GenericAPIView,才......
  • python 递归树状结构 和 排序
    排序defrecursive_sort(self,categories):categories.sort(key=lambdax:x['sort'])forcategoryincategories:ifcategory['children']:category['children']=self.recursive_sort(ca......
  • 【算法】堆排序
    1.堆排序简介堆排序(heapsort)是由J.W.J.Williams于1964年发明的。是一种基于比较的排序算法,和选择排序一样,堆排序将数据序列分为已排序区域和未排序区域两部分。通过从未排列区域中获取最大元素并将其插入已排序区域,迭代这个操作来缩小未排序区域。与选择排序不同的......
  • python基础一:python列表基础和一些经典使用案例
    1.写在前面好久没有更新python这一块的内容了,所以今天整理一块python的内容。今天整理的内容是python里面的列表,作为在python中非常常见的数据类型,尝试用一篇文章来整理其常用的操作,方便以后查看使用。目前可能不全,以后遇到列表相关的操作都放到这篇文章里面来。首先从列表......