计数排序

排序算法 - 计数排序

佐手、 提交于 2019-11-27 11:05:24
基本思想 计数排序是一种线性排序算法,它利用了一个数组,因为数组下标的增长是线性的,所以它就把自己的元素转换成新开辟数组的下标。可是下标都是非负数啊?数组当中的值有正有负啊。做一个简单的转化就行了:找到数组中最小元素,用元素值减去,这样一来,所有元素对应的下标就求出来了。(实际上感觉像是个映射函数?)下图中保存的是待排序数组:[-1,-5,-6,-2,1,2,8,2,1,8] 然后跟哈希排序的思路一样:这里。直接开辟一个对应的哈希数组,然后统计每个元素出现的次数。橙色标注出来的表示待排序数组中没有的元素(转换后的元素),自然就没有出现次数。这样可以看出来如果数组中元素差距很大,其实还是很浪费空间的,因为它新开辟数组的大小是待排序数组arr中max-min+1(8+6+1=15)。 最后再将count中的元素放回到arr中,就完成排序了。 算法代码 1 //计数排序 2 void CountSort(int *a, int size) 3 { 4 int max = a[0]; 5 int min = a[0]; 6 for (int i = 0; i < size; ++i) 7 { 8 if (a[i] > max) 9 max = a[i]; 10 if (a[i] < min) 11 min = a[i]; 12 } 13 int range = max - min + 1;

前端十大算法

一曲冷凌霜 提交于 2019-11-27 05:35:45
排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序; 输入:n个数:a1,a2,a3,…,an 输出:n个数的排列:a1’,a2’,a3’,…,an’,使得a1’ 再讲的形象点就是排排坐,调座位,高的站在后面,矮的站在前面咯。 (3)对于评述算法优劣术语的说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序:所有排序操作都在内存中完成; 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度: 一个算法执行所耗费的时间。 空间复杂度: 运行完一个程序所需内存的大小。 关于时间空间复杂度的更多了解请戳这里,或是看书程杰大大编写的《大话数据结构》还是很赞的,通俗易懂。 (4)排序算法图片总结(图片来源于网络): 排序对比: 这里写图片描述 图片名词解释: n: 数据规模 k:“桶”的个数 In-place: 占用常数内存,不占用额外内存 Out-place: 占用额外内存 排序分类: 这里写图片描述 1.冒泡排序(Bubble Sort) 好的,开始总结第一个排序算法,冒泡排序。我想对于它每个学过C语言的都会了解的吧,这可能是很多人接触的第一个排序算法。 (1)算法描述 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列

Jeronimo's List(模拟+计数排序||桶排)

眉间皱痕 提交于 2019-11-27 05:08:57
 Jeronimo the bear loves numbers and he is planning to write n numbers in his notebook.  After writing the first m numbers, Jeronimo felt that he was spending a lot of time thinking new numbers, so he wrote the next n  -  m missing numbers as the sum modulo 3 × 10 7 of the numbers in the i  -  m and i  -  m  + 1 positions for m  <  i  ≤  n  While Jeronimo was writing, his sister Lupe arrived and asked him q questions. The i  -  th question consist of a number b i , Jeronimo has to say what would be the number in the position b i if all the numbers were sorted in ascending order. Jeronimo wants

计数思想(类似于hash值)

穿精又带淫゛_ 提交于 2019-11-26 23:14:40
//判断数组中是否有重复元素,最直接的思路是用双层循环判断(O(n ^ 2)); //也可以先排序,后比较,但基于比较的排序时间复杂度至少为O(n*logn). //所以,这些思路都不行。根据题目的限制条件,很容易想到用计数排序,时间复杂度为O(n),这当然满足题意,但是,把计数排序用在此处,无疑是大材小用了。 //在计数排序中,有一个关键的步骤是计数,本题就可以利用计数排序中的 计数思想( 有点类似于哈希),程序代码如下: #include<iostream> using namespace std; void print(bool b) { if (b) cout << "yes" << endl; else cout << "no" << endl; } typedef struct Hashtable { int value; int count; }hash; bool hasTheSameNumber(int a[], int n) { int *p = new int[n]; //int *p=new hash[n]; int i; for (i = 0; i < n; i++) //置0 { p[i] = 0; } for (i = 0; i < n; i++) //开始计数 { p[a[i] - 1]++; //p[i].value=a[i]%n; //p[i]