我不知道該怎么辦,我的程式不作業
我需要通過重新排列行來按行的第一個元素按降序對二維陣列進行排序(需要對沒有排序項的字串進行排序)
假設我有一個陣列:
1 2 3
4 5 6
7 8 9
作為程式的結果,我需要得到:
7 8 9
4 5 6
1 2 3 `
using System;
namespace BubbleSort
{
internal class Program
{
static void Main(string[] args)
{
//Объявление массива и его размерности
const int n = 3;
int bubble;
int[,] A =
{
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 },
};
//Алгоритм пузырьковой сортировки
for (int i = 0; i < n; i )
{
for(int j = 0; j < n - 1; j )
{
if (A[i, 0] < A[i , 0])
{
for(j = 0; j < n-1; j )
{
bubble = A[i, j];
A[i, j] = A[i, j 1];
A[i, j 1] = bubble;
}
}
}
}
//Вывод массива
for (int y = 0; y < n; y )
{
for (int x = 0; x < n; x )
{
Console.Write(A[y, x] " ");
}
Console.WriteLine();
}
}
}
}
`
uj5u.com熱心網友回復:
從您評論中的代碼中,我不確定為什么您有一個嵌套回圈來交換值,因為單個回圈就可以了。我已經在這里洗掉了。
如果您參考 Wikipedia 上的偽代碼實作,您會發現您需要在陣列中繼續運行多次傳遞,直到所有內容都被排序。你可以這樣做:
bool swapped;
do
{
swapped = false; // reset swapped
for (int i = 0; i < n - 1; i ) // loop through all but the last row
{
if (A[i, 0] < A[i 1, 0]) // determine if this row needs to be swapped with the next row
{
swapped = true; // mark swapped
for (int j = 0; j < n; j ) // swap each item in row i with each item in row i 1
{
int tmp = A[i, j];
A[i, j] = A[i 1, j];
A[i 1, j] = tmp;
}
}
}
}
while (swapped); // if we swapped anything, we need to make another pass to ensure the array is sorted
我們還可以n通過使用.GetUpperBound(dimension)which 回傳一個介于0and之間的值n - 1(其中 n 是該維度中陣列中的專案數)來消除對的需求。因為結果是有效的n - 1,所以我稍微修改了回圈條件:
bool swapped;
do
{
swapped = false;
for (int i = 0; i < A.GetUpperBound(0); i )
{
if (A[i, 0] < A[i 1, 0])
{
swapped = true;
for (int j = 0; j <= A.GetUpperBound(1); j )
{
int tmp = A[i, j];
A[i, j] = A[i 1, j];
A[i 1, j] = tmp;
}
}
}
}
while (swapped);
我們也可以參考維基百科頁面的“優化冒泡排序”部分并實作它,這將使我們的代碼運行得更優化:
int n = A.GetUpperBound(0); // get the initial value of n
do
{
int newn = 0; // default newn to 0, so if no items are visited, it will remain 0 and the loop will exit
for (int i = 0; i < n; i )
{
if (A[i, 0] < A[i 1, 0])
{
for (int j = 0; j <= A.GetUpperBound(1); j )
{
int tmp = A[i, j];
A[i, j] = A[i 1, j];
A[i 1, j] = tmp;
}
newn = i; // store the current (highest) value of i swapped
}
}
n = newn; // set the value of n to the highest value of i swapped
}
while (n > 0); // loop until n == 0
這里的邏輯(如 Wikipedia 上所解釋的)是在第一遍結束時,最后一項位于正確的位置。到第二遍結束時,倒數第二個和最后一個專案都在正確的位置,依此類推。所以每次,我們可以少訪問一個專案。當我們有 0 個要訪問的專案時,我們有 0 個要交換的專案,并且排序完成。
您可以在這個 YouTube 可視化中看到這個優化版本。
uj5u.com熱心網友回復:
我認為這條線
if (A[i, 0] < A[i , 0])
應該讀
if (A[i, 0] < A[i 1, 0])
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/525608.html
標籤:C#数组冒泡排序
