冒泡排序二维数组

时间:2014-05-24 06:31:08

标签: ruby

我一直在练习鼓泡排序练习。

到目前为止,设法通过数组进行冒泡排序。

让我们说,我们有array = ([5,6,7], [2,3,4])

如何在不修改原始数组或使用sort?

的情况下对其进行冒泡排序

练习要求我不复制/复制/克隆/编辑或使用排序方法。

我的代码冒泡通过常规数组排序:

def bubble_sort(array)
is_sorted = false
  until is_sorted
    is_sorted = true
    (array.count - 1).times do |i|
      if array[i] > array[i + 1]
        array[i], array[i + 1] = array[i + 1], array[i]
        is_sorted = false
      end
    end
  end
end

ARR

4 个答案:

答案 0 :(得分:0)

创建一个新数组,该数组是原始数据的副本并对其进行排序。这将让你保留原始数组并拥有排序数组。

答案 1 :(得分:0)

像往常一样,我学到了很多解决OP的作业: - )

首先"不要复制/复制/克隆/编辑或使用排序方法"只是意味着你必须实现自己的算法。 意味着你不应该复制传递给你的函数的数组。您必须复制原始数组,以避免修改原始数组的副作用。

然而!如果您只是复制数组new_array = array,ruby将通过引用进行复制。

这意味着两个变量仍将指向相同的数据结构。您的排序将很乐意对数字进行排序,并且将修改作为参数传递的数组。

要解决此问题,您需要使用dup函数复制数组。 new_array = array.dup

然后冒泡排序功能最终看起来像这样:

def bubble_sort(array)
  result = array.dup
  begin
    sorted = true
    (0..result.length - 2).each do |i|
      if result[i] > result[i + 1]
        result[i], result[i+1] = result[i+1], result[i]
        sorted = false
      end
    end
  end while !sorted
  result
end

一些测试代码:

a = [9,8,7,6,5,5,9,]
puts "array before sorting:"
puts a.inspect
puts "sorted array returned by function"
puts bubble_sort(a).inspect
puts "original array after sorting:"
puts a.inspect

结果输出:

>ruby mysort.rb
array before sorting:
[9, 8, 7, 6, 5, 5, 9]
sorted array returned by function
[5, 5, 6, 7, 8, 9, 9]
original array after sorting:
[9, 8, 7, 6, 5, 5, 9]

答案 2 :(得分:0)

您可以将两个数组合并为一个数组,然后运行典型的冒泡排序吗?

def combine_arrays(arr1,arr2)
  final = arr1 + arr2
  sorted = true
  while sorted do
    sorted = false
    (0..final.length - 2).each do |x|
      if final[x] > final[x+1]
        final[x], final[x+1] = final[x+1], final[x]
        sorted = true
      end
    end
  end
  final
end

p combine_arrays([1,3,5],[2,4,6]) => [1, 2, 3, 4, 5, 6]

答案 3 :(得分:0)

我认为冒泡排序多维数组的最简单方法是:

int main()
 {
    const size_t row = 4,col=6;
    int temp;
    int arr[row][col] = { { 6, 5, 4, 3, 2, 1 }, { 12, 11, 10, 9, 8, 7 }, {18, 17, 16, 15, 14, 13 }, { 24,23,22,21,20,1 } };
    for (auto &row : arr)
     {
      for (int i = 0; i != col; ++i)
       {
        int flag = 0;
        for (int j = 0; j != col-i - 1; ++j)
        {
            if (row[j]>row[j+1])
            {
                temp = row[j];
                row[j] = row[j + 1];
                row[j + 1] = temp;
                flag = 1;

            }
        }
        if (!flag)break;
      }
 }

for (auto &row : arr)
{
    for (auto col : row)
        cout << col << " ";
    cout << endl;
}


return 0;

}