2016-05-11 53 views
3

第一:哪一个是冒泡排序?

for(int i=0;i<n-1;i++) 
    for(int j=n-1; j>i;j--) 
    if(a[j] < a[j-1]) 
     swap(a[j], a[j-1]); 

或第二:

for(int i=0; i<n-1; i++) 
    for(int j=i+1; j<n; j++) 
    if(a[j] < a[i]) 
     swap(a[j],a[i]); 

或第三个版本:

int temp, i, j = 0; 
    boolean swaped = true; 

    while (swaped) { 
     swaped = false; 
     j++; 
     for(i = 0; i < arr.length - j; i++){ 
      if(arr[i] > arr[i+1]){ 
       temp = arr[i]; 
       arr[i] = arr[i+1]; 
       arr[i+1] = temp; 
       swaped = true; 
      } 
     } 
    } 

有人说,第一,有人说第二。那么哪一个是对的?有人说第二个是交换排序。许多书说泡沫排序是第三个版本,但许多人称第一个版本是泡沫排序。任何意见?

+0

第三个版本 - 有点奇怪。它甚至排序? –

+0

@MichaelDorgan:这是一个泡沫排序的常见优化 –

+0

猜测我很久以前就停止使用它:)我想知道为什么? –

回答

1

我在IntelliJ中使用Java测试了两个代码片段的实际数组。两个版本都按升序排序生成数组。

这里是我使用的阵列:

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

这里是从两个版本的输出:

版本1

[1, 2, 3, 4, 5, 6, 7, 8, 9] 

2版

[1, 2, 3, 4, 5, 6, 7, 8, 9] 

第一个版本看起来像一个标准的气泡排序,而第二个版本看起来像是别的东西。

+0

我得到正确的输出为第二个版本:http://ideone.com/Nn2uT6 – fgb

6

第一个版本是气泡排序,因为它是比较每一对相邻的项目。

第二个版本是选择排序,因为a[i]最终成为外循环的每次迭代后数组未排序右侧部分中的最小项。

+0

你确定这些是选择排序吗?我认为选择排序通过数组的未排序部分,找到最小的元素并将其移动到未排序部分的开始处,然后将未排序部分的大小减小一。 –

+0

@JonathanLeffler这不完全相同。状态与每个外迭代的选择排序相同,但有一些额外的冗余交换。它仍然在寻找最小的元素,但它将交换最小的多次,而不是最后一次。我认为这可能是一些气泡排序变体,但我认为冒泡排序需要交换相邻的元素。 – fgb

+0

有一个“我不太清楚为什么我会困扰”的元素(因为它们都很慢并且不是特别有用),但是也有一个“我希望它是正确的”元素。您会在主要问题的评论中看到,我认为第一个是插入排序,第二个是泡泡排序,第三个是修改后的泡泡排序。我仍然认为没有一种是选择性的;请参阅我对该问题的评论中引用的维基百科文章。 (我在第一个评论中也错了 - 我没有在这里声称完美!) –