基数排序 实现 要点 代码 注释

要点

  • 从个位开始,十位、百位…直到最高位,分别按照个位,十位、百位,直到最高位排序
  • 这样每次排序,依次保证个位大的数在后面,十位大的数在后面、百位大的在后面…直到最高位大的数在后面
  • 是在按照某一位的值有序的序列中,按照另一更大的位排序,最后保证所有数都有序

实现

namespace DataStructure
{
  using System.Collections.Generic;
  /*
  基数排序
  其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较

  将所有待比较数值(正整数)统一为同样的数字长度,数字较短的数前面补零。然后,从最低位开始,依次进行一次排序。
  这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列
   */

  public class RadixSort
  {

    public int[] Sort(int[] array)
    {
      //计算是几位数,几位数就排序几次,从低位往高位排序
      var numLength = GetMaxValLength(array);
      for (var i = 0; i < numLength; i++)
      {
        CountSort(array, i);
      }
      return array;
    }

    public int[] CountSort(int[] array, int offset)
    {
      //数字由0-9组成
      var countArray = new int[10];
      //对0-9这些数出现的次数计数
      for (var i = 0; i < array.Length; i++)
      {
        var a = GetVal(array[i], offset);
        countArray[a]++;
      }

      //二次计数,这些值表明之前的数i-1出现的次数加上上当前的数i出现了多少次,这个次数-1就是这个数i对应的在新数组中的index
      for (var i = 1; i < countArray.Length; i++)
      {
        countArray[i] = countArray[i] + countArray[i - 1];
      }

      var b = new int[array.Length];
      for (var i = array.Length - 1; i >= 0; i--)
      {
        //从原始数组中取一个数,转换成0到9之间的数
        var a = GetVal(array[i], offset);
        //这个数在新数组中的位置为:这个数以及这个数之前的数出现的次数 - 1
        b[countArray[a] - 1] = array[i];
        //用掉了一个数,所以计数-1
        countArray[a]--;
      }

      for (var i = 0; i < array.Length; i++)
      {
        array[i] = b[i];
      }

      return array;
    }

    //个位 offset = 0, 十位 offset = 1
    public static int GetVal(int val, int offset)
    {
      var devide = 1;
      for (var i = 0; i < offset; i++)
      {
        devide *= 10;
      }
      return val / devide % 10;
    }

    public static int GetMaxValLength(int[] array)
    {
      var max = array[0];
      for (var i = 0; i < array.Length; i++)
      {
        max = System.Math.Max(array[i], max);
      }
      return max.ToString().Length;
    }

  }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C++实现插入排序的代码及其注释: ```cpp #include <iostream> using namespace std; void insertionSort(int arr[], int n) { int i, key, j; for (i = 1; i < n; i++) { key = arr[i]; // 选出当前要插入的元素 j = i - 1; // 将比 key 大的元素往后移 while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; // 在 j+1 处插入 key } } int main() { int arr[] = { 12, 11, 13, 5, 6 }; int n = sizeof(arr) / sizeof(arr[0]); insertionSort(arr, n); for (int i = 0; i < n; i++) { cout << arr[i] << " "; } return 0; } ``` 注释说明: 1. `void insertionSort(int arr[], int n)`:插入排序函数,接收一个整型数组和数组长度作为参数,不返回任何值。 2. `int i, key, j;`:定义循环计数器 i、当前要插入的元素 key 和循环计数器 j。 3. `for (i = 1; i < n; i++)`:循环从第二个元素开始遍历,因为第一个元素已经是有序的了。 4. `key = arr[i];`:选出当前要插入的元素。 5. `j = i - 1;`:将 j 设为 i 的前一个元素。 6. `while (j >= 0 && arr[j] > key)`:如果 j 大于等于 0 且 arr[j] 大于 key,则将 arr[j] 往后移。 7. `arr[j + 1] = key;`:在 j+1 处插入 key。 8. `int main()`:主函数。 9. `int arr[] = { 12, 11, 13, 5, 6 };`:定义一个整型数组。 10. `int n = sizeof(arr) / sizeof(arr[0]);`:计算出数组的长度。 11. `insertionSort(arr, n);`:调用插入排序函数。 12. `for (int i = 0; i < n; i++)`:遍历数组并输出排序后的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值