更新:感謝@AdrianHHH 的提示和@steveOh 對我正確陣列的修復以及每個人的建議。它現在正在運行,但它給了我一個不同的答案。例如,冒泡排序會將“程式”排序為“agmoprr”,但我的合并排序會將其排序為“gpramro”。冒泡排序已經作為示例給出,我測驗了 java 程式的輸入:“程式”輸出:“程式”,這不是我想要的,但如果你在兩者之間放置空格,它會排序為“agmoprr”,這是相同的作為冒泡排序。
我目前正在除錯,但我真的需要幫助,這是我第二次除錯,因為我們很少進行演算法實作。另外,感謝大家檢查和糾正我的錯誤。
我試圖轉換為 C# 的 Java 中的字串合并排序:
public static void mergeSort(List<String> list){
// need base case - should be a single if statement
if (list.size() > 1){
List<String> left = new LinkedList<>(list.subList(0, list.size() / 2));
List<String> right = new LinkedList<>(list.subList(list.size() / 2, list.size()));
// recursively sort the two halves
mergeSort(left);
mergeSort(right);
// merge the sorted left and right subLists together
merge(list, left, right);
}
}
public static void merge(List<String> result, List<String> left, List<String> right){
int i1 = 0; // index for left
int i2 = 0; // index for right
for (int i = 0; i < result.size(); i ) {
if (i2 >= right.size() || (i1 < left.size() && left.get(i1).compareToIgnoreCase(right.get(i2)) < 0)){
result.remove(i);
result.add(i, left.get(i1));
i1 ;
} else {
result.remove(i);
result.add(i, right.get(i2));
i2 ;
}
}
Converted String Merge Sort in C#: ( giving different output "gpramro")
public class MergeSort : ISortStrategy
{
public string Sort(string input)
{
var result = "";
int size = (input.Length % 2 == 0) ? input.Length / 2 : (input.Length 1) / 2;
if (input.Length > 1)
{
char[] left = input.Substring(0, input.Length / 2).ToCharArray();
char[] right = input.Substring(input.Length / 2,input.Length - (input.Length / 2)).ToCharArray();
// recursively sort the two halves
Sort(left.Length.ToString());
Sort(right.Length.ToString());
// merge the sorted left and right subLists together
result = merge(input, left, right);
}
return result;
}
public string merge(string result, char[] left, char[] right)
{
int i1 = 0; // index for left
int i2 = 0; // index for right
var theString = result;
var aStringBuilder = new StringBuilder(theString);
for (int i = 0; i < aStringBuilder.Length; i )
{
if (i2 >= right.Length || (i1 < left.Length && left.GetValue(i1).ToString().CompareTo(right.GetValue(i2).ToString()) < 0))
{
aStringBuilder.Remove(i, 1);
aStringBuilder.Insert(i, left.GetValue(i1).ToString());
i1 ;
}
else
{
aStringBuilder.Remove(i, 1);
aStringBuilder.Insert(i, right.GetValue(i2).ToString());
i2 ;
}
}
theString = aStringBuilder.ToString();
return theString;
}
}
Interface - The Interface and bubblesort is already given, so if I change the interface then I have to change the bubblesort and quicksort, but both are already implemented.
public interface ISortStrategy
{
string Sort(string input);
}
Bubblesort - Given as a sample
public string Sort(string input)
{
var result = "";
var arr = input.ToCharArray();
char temp;
for (int write = 0; write < arr.Length; write )
{
for (int sort = 0; sort < arr.Length - 1; sort )
{
if (arr[sort] > arr[sort 1])
{
temp = arr[sort 1];
arr[sort 1] = arr[sort];
arr[sort] = temp;
}
}
}
for (int i = 0; i < arr.Length; i )
result = arr[i];
return result;
}
Quicksort - Done using the given interface
public string Sort(string input)
{
char[] charactersToSort = input.ToCharArray();
int low = 0;
int high = charactersToSort.Length - 1;
quickSort(charactersToSort, low, high);
return new string(charactersToSort);
}
uj5u.com熱心網友回復:
讓我們以您提供的“程式”示例輸入字串為例。
我所做的第一個更改是從字符陣列和字串的混合切換到純粹的字串列。您面臨的問題之一來自當您再次呼叫 Sort 時,您傳入了左右陣列的長度,而不是陣列本身。這已在提供的代碼中得到糾正。
這段代碼的一般結構在這里找到,我只是將其轉換為字串版本。
新的 ISortStrategy.cs:
public interface ISortStrategy
{
List<char> Sort(List<char> input);
}
新的 MergeSort.cs:
public class MergeSort : ISortStrategy
{
public List<char> Sort(List<char> unsorted)
{
if (unsorted.Count <= 1)
return unsorted;
List<char> left = new();
List<char> right = new();
int middle = unsorted.Count / 2;
for (int i = 0; i < middle; i )
left.Add(unsorted[i]);
for (int i = middle; i < unsorted.Count; i )
right.Add(unsorted[i]);
left = Sort(left);
right = Sort(right);
return Merge(left, right);
}
private List<char> Merge(ICollection<char> left, ICollection<char> right)
{
List<char> result = new();
while (left.Count > 0 || right.Count > 0)
{
switch (left.Count)
{
case > 0 when right.Count > 0:
{
if ((left.First() % 32) <= (right.First() % 32))
{
result.Add(left.First());
left.Remove(left.First());
}
else
{
result.Add(right.First());
right.Remove(right.First());
}
break;
}
case > 0:
result.Add(left.First());
left.Remove(left.First());
break;
default:
{
if (right.Count > 0)
{
result.Add(right.First());
right.Remove(right.First());
}
break;
}
}
}
return result;
}
}
分揀系統的新實作:
string result = new(new MergeSort().Sort("program".ToList()).ToArray());
Console.WriteLine(result);
When using this code with the input string "program" the output should be "agmoprr"
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/444758.html
