刚才我正在学习C ++编程语言,我决定通过编写代码来实现它。我尝试编写一个算法,它将数组中的项目从min
值开始排序到max
值,以便我得到一个像这样的整数数组
int arrayToSort[] = {3,5,3,1,8,7,2,4};
并尝试编写一个算法,对该数组进行排序。您可以在下面看到源代码
int arrayToSort[] = {3,5,3,1,8,7,2,4};
int arrayToSortSize = sizeof(arrayToSort)/sizeof(int);
for(int i=1; i<arrayToSortSize; ++i) {
int* first = arrayToSort;
int* end = arrayToSort + arrayToSortSize;
for(first; first!=end-i; ++first) {
if (*first > *(first+1)) {
int temp = *first;
*first = *(first+1);
*(first+1) = temp;
}
}
}
这个算法工作正确并对数组中的所有元素进行排序1, 2, 3, 3, 4, 5, 7, 8
但是我想知道 这个算法是否正确进行这样的排序,我的意思是这是排序所有的最短方法在这种情况下的元素?
这里我实现相同的算法,但这次我使用数组而不是指针,你可以看到下面的源代码:
int arrayToSortSize = sizeof(arrayToSort)/sizeof(int);
for(int i=1; i<arrayToSortSize; ++i) {
int* first = arrayToSort;
int* end = arrayToSort + arrayToSortSize;
for(int j=0; j<arrayToSortSize-i; j++) {
if (arrayToSort[j] > arrayToSort[j+1]) {
int temp = arrayToSort[j];
arrayToSort[j] = arrayToSort[j+1];
arrayToSort[j+1] = temp;
}
}
}
此算法也很有效。它正确地对所有项目进行排序,但我想知道 哪种算法更好用,哪一种更快(如果其中之一)?
答案 0 :(得分:3)
您的两个“算法”是同一算法的两个实现,称为冒泡排序。
这是进行排序的最简单算法,但表现不佳(二次复杂度)。
如果你想深入研究排序算法,那么有很好的书籍,我特别喜欢this one。
如果您只想查看效果更快的算法,请查看quicksort
或mergesort
。它们都有优点和缺点,但您通常可以根据应用程序和数据大小选择其中一个。
更一般地说,更喜欢std::sort
,在相关和可能的情况下,根据您的数据大小,在获取所需的特定算法方面做得很好。只有当您发现自己有表演问题(或用于学习目的)时,您才能看到实施自己的sort
。但是你真的必须知道你在做什么,因为很容易编写性能不佳的排序实现(即使是一个好的算法)。
编辑(精确度):在现实生活中,当阵列足够小(比如少于20个项目)时,请使用insertion sort
。否则,如果您对数据没有更多假设,请使用quicksort
。这种截止的原因是,与使用快速insertion sort
相比,递归调用的成本会占用少量数据的开销。
答案 1 :(得分:0)
都不是。
在大多数情况下,使用数组和指针之间的差异是可以忽略的。
算法I和II都是所谓的冒泡排序。在某些情况下,这是一种有效的排序,但很少是最快的排序。
答案 2 :(得分:0)
两种算法都找到了更大的值,然后是第二种等... 所以如果你有N个元素,第一次循环运行将比较N-1个元素,循环中的第二个线将比较N-2等。
它叫做冒泡排序。 它需要近似(N-1)N / 2比较操作。 如果使用快速排序(例如)二进制搜索,则需要O(N log N)操作,这对于大量N是至关重要的。 Quicksort from wiki