我一直在练习鼓泡排序练习。
到目前为止,设法通过数组进行冒泡排序。
让我们说,我们有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
答案 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;
}