首页 > 编程语言 >排序算法:非比较排序

排序算法:非比较排序

时间:2022-12-04 21:33:58浏览次数:29  
标签:sz arr min int ++ 算法 child 排序 比较

堆排序

void AdjustDown(int* arr, int sz, int root)//向下调整
{
	int parent = root;
	int child = root * 2 + 1;
	while (child < sz)
	{
		if (child + 1 < sz && arr[child] < arr[child + 1])
			child++;
		if (arr[child] > arr[parent])
			swap(arr + parent, arr + child);
		else
			break;
		parent = child;
		child = parent * 2 + 1;
	}
}

void HeapSort(int* arr, int sz)
{
	for (int i = (sz - 2) / 2; i >= 0; i--)
	{
		AdjustDown(arr, sz, i);
	}
	while (sz > 1)
	{
		swap(arr, arr + sz - 1);
		sz--;
		AdjustDown(arr, sz, 0);
	}
}

计数排序

void CountSort(int* a, int n)
{
	int min = a[0];
	int max = min;
	for (int i = 0; i < n; i++)
	{
		if (min > a[i])
			min = a[i];
		if (max < a[i])
			min = a[i];
	}
	int sz = max - min + 1;
	int* countarry = (int*)malloc(sizeof(int) * sz);
	assert(countarry);
	memset(countarry, 0, sizeof(int) * sz);
	for (int i = 0; i < n; i++)
	{
		countarry[a[i] - min]++;
	}
	int index = 0;
	for (int i = 0; i < sz; i++)
	{
		while (countarry[i] > 0)
		{
			a[index++] = i + min;
			countarry[i]--;
		}
	}
	free(countarry);
}

基数排序

无法对负数和浮点数进行排序

#include <stdio.h>
#include <string.h>

const int MAXN = 100005;          // (1) 排序数组的元素最大个数
const int MAXT = 8;               // (2) 排序元素的数字的最大位数
const int BASE = 10;              // (3) 排序元素的进制,这里为十进制;
int PowOfBase[MAXT];              // (4) Powofbase[i]代表BASE的主次幂
int RadixBucket[BASE][MAXN];      // (5) Radixbucket[i]代表第i个队列
int RadixBucketTop[BASE];         // (6) Radixbuckettop[i]代表第i个队列的尾指针
            
void InitPowOfBase() 
{
    int i;
    PowOfBase[0] = 1;
    for(i = 1; i < MAXT; ++i) 
    {
        PowOfBase[i] = PowOfBase[i-1] * BASE;   // (7)初始化BASE的主次幂
    }
}

int getRadix(int value, int pos) 
{
    return value / PowOfBase[pos] % BASE;            // (8)计算 value 的pos位的值
}

void RadixSort(int n, int *a) 
{                                   // (9)void Radixsort(intn,int*a)为基数排序的实
                                    //现,代表对a[]数组进行升序排序
    int i, j, top = 0, pos = 0;
    while (pos < MAXT) 
    {                                           // (10)进行MAXT轮迭代;
        memset(RadixBucketTop, 0, sizeof(RadixBucketTop));  
        // (11)迭代前清空队列,只需要将队                                                         //列尾指针置零即可
        for(i = 0; i < n; ++i) 
        {
            int rdx = getRadix(a[i], pos);
            RadixBucket[ rdx ][ RadixBucketTop[rdx]++ ] = a[i];// (12)入队操作
        }
        top = 0;
        for(i = 0; i < BASE; ++i) 
        {
            for(j = 0; j < RadixBucketTop[i]; ++j) 
            {
                a[top++] = RadixBucket[i][j];        // (13)将队列中的元素按顺序塞回原数组
            }
        }
        ++pos; 
    }
}

int a[MAXN];

int main() 
{
    int n;
    InitPowOfBase();
    while(scanf("%d", &n) != EOF) 
    {
        Input(n, a);
        RadixSort(n, a);
        Output(n, a);
    }
    return 0;
} 

标签:sz,arr,min,int,++,算法,child,排序,比较
From: https://www.cnblogs.com/ncphoton/p/16950872.html

相关文章

  • 排序算法:归并排序
    递归实现void_MergeSort(int*arr,intleft,intright,int*tmp){ if(left>=right) return; intmid=left+(right-left)/2; _MergeSort(arr,left,......
  • 卡尔曼滤波之最优状态估计和最优状态估计算法
    1.最优状态估计情景1:假设一个一个比赛中,不同队伍的自动驾驶汽车使用GPS定位,在100种不同的地形上各行驶1公里。每次都尽可能停在终点。然后计算每只队伍的平均最终......
  • 页式存储管理--两种置换算法的实现
    一.实验目的1.了解虚拟存储技术,通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。2.掌握FIFO和LRU等置换算法,加强对地址转换过程的了解。二.实验内容......
  • sm-crypto密码算法库
    一、环境配置在之前的node.js库配置中,我们已经配置好了node和npm,再次检查配置情况node-vnpm-vnpminstall--saveminiprogram-sm-crypto二、进入工作目录/usr/l......
  • 第二章 算法基础
    第2章算法基础第二周记于2022/12/4如何描述算法使用一致性符号来分析算法的运算时间通过归并排序来学习分而治之方法插入排序......
  • 如何用JDK优雅的实现几个算法
    今天给大家介绍下八股文中的两个重要成员,LinkedHashMap和TreeMap。 这两者都实现了Map接口,也经常会在面试中被拿来与HashMap比较。 到底它们能使用哪些魔法呢,接下来......
  • 排序链表 重排链表 最接近目标价格的甜点成本 环形链表
    148.排序链表弄到数组里,数组排序,再弄个新链表Listlist=newArrayList<>();ListNodepre=head;while(pre!=null){list.add(pre.val);pre=pre.next;}int[......
  • Node.js实现国密算法
    一、node.js环境安装1去官网下载压缩包,并放置到/usr/local/bin文件夹下2进行环境变量配置vim/etc/profile在环境变量文件的末尾添加exportNODEJS=/usr/local/b......
  • golang的希尔排序
    1、什么是希尔排序:插入排序的一种又称“缩小增量排序”(DiminishingIncrementSort),是直接插入排序算法​的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.......
  • 算法刷题532113D
    题目链接https://vjudge.net/contest/532113#problem/D思考虽然AC之后觉得题目难度不是很高,但也是第一次做比较综合的题目,花了快一天才做出来,只能说水平还是菜思路......