Carrays排序技巧
a=[1,3,6,7,1,2]
哪个是排序以下数组的最佳排序技术,如果有重复,如何处理它们。 也是最好的分拣技术….
void BubbleSort(int a[], int array_size) { int i, j, temp; for (i = 0; i < (array_size - 1); ++i) { for (j = 0; j a[j+1]) { temp = a[j+1]; a[j+1] = a[j]; a[j] = temp; } } } }
在C中,您可以使用内置的qsort
命令:
int compare( const void* a, const void* b) { int int_a = * ( (int*) a ); int int_b = * ( (int*) b ); if ( int_a == int_b ) return 0; else if ( int_a < int_b ) return -1; else return 1; } qsort( a, 6, sizeof(int), compare )
请参阅: http : //www.cplusplus.com/reference/clibrary/cstdlib/qsort/
要回答问题的第二部分:最佳(基于比较)排序算法是使用O(n log(n))比较运行的算法。 有几个具有此属性(包括快速排序,合并排序,堆排序等),但使用哪个取决于您的用例。
作为旁注,如果您对数据有所了解,有时可以比O(n log(n))更好 - 请参阅有关Radix Sort的维基百科文章
在您的特定情况下,最快的排序可能是本答案中描述的排序。 它针对6个整数的arrays进行了精确优化,并使用了排序网络。 它比库qsort快20倍 (在x86上测量)。 排序网络对于某种固定长度的arrays是最佳的。 由于它们是固定的指令序列,因此甚至可以通过硬件轻松实现。
一般来说,有许多排序算法针对某些特殊情况进行了优化。 堆排序或快速排序等通用算法针对项目数组的就地排序进行了优化。 它们产生O(n.log(n))的复杂度,n是要排序的项目数。
库函数qsort()在复杂性方面编码非常好并且效率很高,但是使用了对用户提供的某些比较函数的调用,并且该调用具有相当高的成本。
对于排序非常大量的数据算法也需要处理数据与磁盘的交换,这是在数据库中实现的那种排序,如果你有这样的需求,最好的办法是将数据放入某个数据库并使用内置排序。
要看
这取决于各种各样的事情。 但一般来说,使用Divide-and-Conquer / dichotomic方法的算法在排序问题时表现良好,因为它们呈现出有趣的平均情况复杂性。
基本
要了解哪种算法效果最好,您需要具备算法复杂度和大O符号的基本知识,因此您可以了解它们在平均情况,最佳情况和最差情况方面的评分。 如果需要,您还必须注意排序算法的稳定性 。
例如,通常一种有效的算法是快速排序。 但是,如果你给quicksort一个完美的反转列表,那么它的表现会很差(在这种情况下,简单的选择排序会表现得更好!)。 如果对列表进行预分析,Shell-sort通常也是quicksort的一个很好的补充。
对于使用分而治之的方法进行“高级搜索”,请查看以下内容:
- 快速排序
- 希尔排序
- 归并排序
对于不太复杂的算法,这些更直接的算法:
- 冒泡
- 选择排序
- 插入排序
进一步
上面是开始时常见的嫌疑人,但也有无数其他人。
正如R.在评论中和kriss在他的回答中指出的那样,你可能想看看HeapSort ,它提供了理论上比快速排序更好的排序复杂性(但在实际环境中通常不会更好)。 还有变体和混合算法 (例如TimSort )。
所有最好的分类技术通常取决于arrays的大小。 合并排序可能是最好的,因为它根据Big-O算法管理更好的空间和时间复杂度(这适用于大型arrays)。
我想做一些更改:在C中,您可以使用内置的qsort命令:
int compare( const void* a, const void* b) { int int_a = * ( (int*) a ); int int_b = * ( (int*) b ); // an easy expression for comparing return (int_a > int_b) - (int_a < int_b); } qsort( a, 6, sizeof(int), compare )