冒泡排序算法实现

时间:2013-03-05 20:38:58

标签: c++ arrays sorting

问题描述

刚才我正在学习C ++编程语言,我决定通过编写代码来实现它。我尝试编写一个算法,它将数组中的项目从min值开始排序到max值,以便我得到一个像这样的整数数组

    int arrayToSort[] = {3,5,3,1,8,7,2,4};

并尝试编写一个算法,对该数组进行排序。您可以在下面看到源代码

算法I

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但是我想知道 这个算法是否正确进行这样的排序,我的意思是这是排序所有的最短方法在这种情况下的元素?

算法II

这里我实现相同的算法,但这次我使用数组而不是指针,你可以看到下面的源代码:

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;
        }   
    }
}

此算法也很有效。它正确地对所有项目进行排序,但我想知道 哪种算法更好用,哪一种更快(如果其中之一)?

问题

  • 哪种算法更好用?
  • 哪种算法更快?或者他们的工作速度相同?
  • 算法I 算法II 能否以更好的方式实施?
  • 这个算法如何调用?

Sorting example image

3 个答案:

答案 0 :(得分:3)

您的两个“算法”是同一算法的两个实现,称为冒泡排序

这是进行排序的最简单算法,但表现不佳(二次复杂度)。

如果你想深入研究排序算法,那么有很好的书籍,我特别喜欢this one

如果您只想查看效果更快的算法,请查看quicksortmergesort。它们都有优点和缺点,但您通常可以根据应用程序和数据大小选择其中一个。

更一般地说,更喜欢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