这个程序还有点问题,
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查到详细用法