计数排序c语言

Python013

计数排序c语言,第1张

这个程序还有点问题,

1. 动态数组申请

2. 访问越界

3. 输出错误

应该就这三个问题了吧,简单的调试了下。

1. 在第9行出现,比较好解决。使用malloc内存分配函数直接解决,注意,在使用完成后需要用free()去释放这段内存,否则会出现内存泄露。

2. 这个出现在第22行,判断条件写错了,应该判断是j,而不是i。可以将我改过的程序和原始程序进行比较。

3. 这个出现在第38行,因为这里对B数组进行修改,或者说排序,所以应该输出的B数组的元素。而原始程序是输出A数组的元素,这里A数组中的元素并没有改变,所以,输出肯定和定义A时一样,不会出现期望的顺序。

贴一下我执行的结果:

修改后的代码:

#include <stdio.h>

#include <string.h>

#include <malloc.h>

//计数排序函数

void counting_sort(int A[], int B[], int k, int length)     //k 为待排序数组A中最大元素

{

int i, j, temp

int *C = (int*)malloc(sizeof(int) * (k + 1))

for (i = 0 i <= k i++)                        //数组C初始化 

{

C[i] = 0

}

for (j = 1 j <= length - 1 j++)                //C[i]中包含等于i的元素的个数 

{

C[A[j]] = C[A[j]] + 1

}

for (i = 1 i <= k i++)                        //C[i]中包含小于或等于i的元素的个数 

{

C[i] = C[i] + C[i - 1]

}

for (j = length - 1 j >= 0 j--)                //元素重排 

{

B[C[A[j]]] = A[j]

C[A[j]]--

}

free(C)

}

//测试计数排序函数

main()

{

int A[] = { 2, 6, 1, 2, 4, 5, 9, 6, 4, 5, 8, 2, 3, 7 }

int B[] = { 2, 6, 1, 2, 4, 5, 9, 6, 4, 5, 8, 2, 3, 7 }

int k = 9, i

counting_sort(A, B, 9, 14)

for (i = 0 i <= 13 i++)

printf("    %d", B[i])

printf("\n")

return 0

}

稳定的

冒泡排序(bubble sort) — O(n^2)

鸡尾酒排序(Cocktail sort,双向的冒泡排序) — O(n^2)

插入排序(insertion sort)— O(n^2)

桶排序(bucket sort)— O(n)需要 O(k) 额外空间

计数排序(counting sort) — O(n+k)需要 O(n+k) 额外空间

合并排序(merge sort)— O(nlog n)需要 O(n) 额外空间

原地合并排序— O(n^2)

二叉排序树排序 (Binary tree sort) — O(nlog n)期望时间; O(n^2)最坏时间; 需要 O(n) 额外空间

鸽巢排序(Pigeonhole sort) — O(n+k)需要 O(k) 额外空间

基数排序(radix sort)— O(n·k)需要 O(n) 额外空间

Gnome 排序— O(n^2)

图书馆排序— O(nlog n) with high probability,需要 (1+ε)n额外空间

不稳定的

选择排序(selection sort)— O(n^2)

希尔排序(shell sort)— O(nlog n) 如果使用最佳的现在版本

组合排序— O(nlog n)

堆排序(heapsort)— O(nlog n)

平滑排序— O(nlog n)

快速排序(quicksort)— O(nlog n) 期望时间,O(n^2) 最坏情况; 对于大的、乱数列表一般相信是最快的已知排序

Introsort— O(nlog n)

Patience sorting— O(nlog n+ k) 最坏情况时间,需要 额外的 O(n+ k) 空间,也需要找到最长的递增子串行(longest increasing subsequence)

不实用的排序算法

Bogo排序— O(n× n!) 期望时间,无穷的最坏情况。

Stupid sort— O(n^3)递归版本需要 O(n^2) 额外存储器

珠排序(Bead sort) — O(n) or O(√n),但需要特别的硬件

Pancake sorting— O(n),但需要特别的硬件

stooge sort——O(n^2.7)很漂亮但是很耗时

没事多去百度百科找!

如果是C语言的话只能手写堆排序、归并排序或者快速排序等等

如果是用C++的话可以看下面:

10W量级直接考虑使用STL的sort函数,用法自行百度或者参见http://www.cplusplus.com/reference/algorithm/sort/

sort函数默认是升序排序,要降序排序可以传cmp函数过去或者sort完了reverse

1000W量级考虑使用计数排序或者基数排序,这两种排序对被排序数字的大小有一定限制

如果是1000W量级的实数排序,或者数字可能很大的话,那么还是回到之前说的sort

STL里提供了很多O(nlogn)级别的排序函数,比如sort、qsort、stable_sort

另外还有简化归并排序代码用的merge函数等等

以上所有函数均能在cplusplus.com查到详细用法