首页 > 其他分享 >计数排序(排序终篇)

计数排序(排序终篇)

时间:2024-06-08 09:02:28浏览次数:23  
标签:min int 计数 数组 排序 终篇 size

1.计数排序

2.排序的稳定性

1.计数排序

1.1计数排序的概念

计数排序就是把要排序的数组的里面的数据在有序的数组中记录次数,每个数据有多少个就在另一个数组(有序的)上对应的位置加多少,有俩个2就在有序的数组下标2的位置标2,最后把有序数组的元素按顺序一个一个搬过来,这样就把数组排好了。

1.2代码实现

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

void CountSort(int* a, int n)
{
	int min = a[0], max = a[0];
	for (int i = 0; i < n; i++)
	{
		if (a[i] < min)
		{
			min = a[i];
		}
		if (a[i] > max)
		{
			max = a[i];
		}

	}
	int range = max - min + 1;//知道俩个边界求中间有多少个,右-左+1
	int* count = (int*)calloc(range, sizeof(int));
	if (count == NULL)
	{
		perror("calloc fail:");
		return;
	}
	for (int i = 0; i < n; i++)
	{
		count[a[i] - min]++;
	}
	int j = 0;
	for (int i = 0; i < range; i++)
	{
		while (count[i]--)
		{
			a[j++] = i + min;
		}
	}
}
int main()
{
	int a[] = {9,1,8,2,7,3,6,4,5};
	int size = sizeof(a) / sizeof(a[0]);
	//InsertSort(a, size);
	//ShellSort(a, size);
	//MergeNonR(a, size);
	//SelectSort(a, size);
	CountSort(a, size);
	for (int i = 0; i < size; i++)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

 代码分析:
第一个for是去找到最大值和最小值为了获得边界值,而且用calloc还需要找到有多少个元素,第三个for是去计数,a[i]-min就是一个相对值,因为开辟的空间是从最小到最大都有,假设100是最低值也就是下标为0,那么101就是100后面一个下标为1,a[i]-min就是去得到count的下标,有了下标才能给对应的位置计数,最后一个for就是把count中计数大于0的位置把i+min放到数组alm,因为a[i]-min=下标,那么a[i]=下标+min就是对应的值,这里while里面的条件是count[i]--,如果一开始是0就不会进,是1则进去后就变为0,这个是原数组有重复的数据。

1.3计数排序的时间复杂度

第一个for遍历了原数组N次,最后一个for循环遍历了开辟的数组range次,则总的时间复杂度为O(N+range)

1.4计数排序的缺陷

计数排序适合整数于范围集中的,因为是在开辟的数组是计数,如果不是整数不好记录,范围如果不集中则会开辟很多空间,但是很多空间用不上就会造成空间浪费。

2.排序的稳定性

稳定性:相同的值相对顺序不变 

排序的稳定性简单来说,在排排队中,A和B一样高,A站在B前 ,排完后,若A还是在B前面则就是稳定性好,A在B后面则就不稳定,在上面的排序中一般复杂的排序都不稳定,像堆排序,希尔排序快速排序,堆排序若一样大的数字在不同子树,则在先上或者向下调整的过程中就容易发生本来在B前面,调整完后到B后面去了,希尔设置gap组就有可能一样大的数据在不同gap组里面,这样也容易发生上面的情况,而快速排序在全是一样的数据中,最后会把相遇的地方于第一个交换这样就不稳定了。

标签:min,int,计数,数组,排序,终篇,size
From: https://blog.csdn.net/2302_80378107/article/details/139529710

相关文章

  • 慢慢写 十二重计数法
    \(n\)球\(m\)​盒。谁家数学答题卡。\(\text{I}\):球之间互不相同,盒子之间互不相同。每个球\(m\)种放法,\(n^m\)。\(\text{II}\):球之间互不相同,盒子之间互不相同,每个盒子至多装一个球。\(n>m\)则\(0\)。\[\binom{m}{n}n!=\frac{m!}{n!(m-n!)}n!=\frac{m!}{(m......
  • 快速排序
    funcsortArray(nums[]int)[]int{quickSort(nums,0,len(nums)-1)returnnums}//快排,分治的思想,选一个中轴,//把小于中轴的元素放到左边,大于中轴的元素放到右边//然后递归处理中轴两边的元素funcquickSort(nums[]int,left,rightint){ifleft>=......
  • 8644 堆排序
    Description用函数实现堆排序,并输出每趟排序的结果输入格式第一行:键盘输入待排序关键的个数n第二行:输入n个待排序关键字,用空格分隔数据输出格式第一行:初始建堆后的结果其后各行输出交换堆顶元素并调整堆的结果,数据之间用一个空格分隔输入样例10548093267......
  • 【JS封装-数组操作】强化编程实践:精选JavaScript函数封装集锦-关于数组操作(数组去重、
    目录数组去重数组快速排序过滤数组映射数组数组扁平化数组求和数组最大值数组最小值数组切片数组乱序(洗牌算法)数组去重/***去除数组中的重复项。*@param{Array}array要去重的数组。*@returns{Array}去重后的数组。*/functionuniqueArray(array......
  • 列举常见的排序和查找算法
    在编程和算法设计中,排序和查找算法是非常基础和重要的。以下是常见的一些排序和查找算法:排序算法冒泡排序(BubbleSort)原理:重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序......
  • 数据结构与算法-17_排序算法
    文章目录1.概述比较排序算法非比较排序算法稳定vs不稳定Java中排序2.冒泡排序3.选择排序4.堆排序5.插入排序6.希尔排序7.归并排序递归实现时间复杂度非递归实现8.归并+插入9.快速排序随机基准点处理重复值10.计数排序11.桶排序12.基数排序习题E01.根据另一个数组......
  • Java实现常见的排序算法
    ......
  • JVM之GC篇:(一)引用计数与可达性分析
    文章目录0x00前言0x01引用计数0x02可达性分析0x03总结0x00前言GC的第一步就是要判断出哪些对象需要被回收。显然易见的是,当一个对象不再被使用后,那么就需要对其进行回收。那么问题就是,如何判断对象是否被使用?本文将介绍两种算法来判断对象的使用情况。0x01引......
  • 数据结构学习笔记-归并排序
    归并排序算法的设计与分析问题描述:设计并分析归并排序算法【算法设计思想】分割(Divide):从中间分割数组,使每个子数组包含一半的元素。这通过计算中点m来完成,通常是(l+r)/2,但为了防止大数溢出,使用l+(r-l)/2。解决(Conquer):递归地对两个子数组应用归并排序,直到......
  • 八大排序(使用C语言)
    完整代码链接:诶嘿/DataStructure-码云-开源中国(gitee.com)目录一、排序的概念及应用:1.排序的概念:2.排序应用:二、常见排序算法的实现: 1 插入排序:1.1基本思想:1.2直接插入排序:1.2.1代码实现: 1.2.2测试:1.2.3时空复杂度:1.3希尔排序(缩小增量排序):1.3.1......