简单的冒泡排序c#

int[] arr = {800,11,50,771,649,770,240, 9}; int temp = 0; for (int write = 0; write < arr.Length; write++) { for (int sort = 0; sort  arr[sort + 1]) { temp = arr[sort + 1]; arr[sort + 1] = arr[sort]; arr[sort] = temp; } } Console.Write("{0} ", arr[write]); } 

我试图做的就是使用这个数组进行简单的冒泡排序。 我想弄清楚为什么排序搞砸了。 例如,这里的数组是{800,11,50,771,649,770,240, 9}

以下是显示的内容: 11, 50, 649, 9, 649, 770, 771, 800

我想我可能会在比较中遗漏一些东西。

不,您的算法有效,但您的Write操作在外部循环中放错了位置。

 int[] arr = { 800, 11, 50, 771, 649, 770, 240, 9 }; int temp = 0; 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++) Console.Write(arr[i] + " "); Console.ReadKey(); 

这个对我有用

 public static int[] SortArray(int[] array) { int length = array.Length; int temp = array[0]; for (int i = 0; i < length; i++) { for (int j = i+1; j < length; j++) { if (array[i] > array[j]) { temp = array[i]; array[i] = array[j]; array[j] = temp; } } } return array; } 
 public static void BubbleSort(int[] a) { for (int i = 1; i <= a.Length - 1; ++i) for (int j = 0; j < a.Length - i; ++j) if (a[j] > a[j + 1]) Swap(ref a[j], ref a[j + 1]); } public static void Swap(ref int x, ref int y) { int temp = x; x = y; y = temp; } 

我看到有人使用这个例子作为工作申请测试的一部分。 我对他的反馈是,当数组大部分排序时,它没有从外循环中逃脱。

考虑在这种情况下会发生什么:

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

这是更有意义的事情:

 int[] arr = {1,2,3,4,5,6,7,8}; int temp = 0; int loopCount=0; bool doBreak=true; for (int write = 0; write < arr.Length; write++) { doBreak=true; 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; doBreak=false; } loopCount++; } if(doBreak){ break; /*early escape*/ } } Console.WriteLine(loopCount); for (int i = 0; i < arr.Length; i++) Console.Write(arr[i] + " "); 
 int[] arr = { 800, 11, 50, 771, 649, 770, 240, 9 }; int temp = 0; for (int write = 0; write < arr.Length; write++) { for (int sort = 0; sort < arr.Length - 1 - write ; 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++) Console.Write(arr[i] + " "); Console.ReadKey(); 

你的Console.Write("{0} ", arr[write]); 太早了。 您在排序仍在进行时打印值。 例如,你在数组中打印9作为索引3,但是在循环的下一次迭代中, 9已经移动到索引2而240已经移动到索引3 …但是你的外循环已经移动了向前,所以它第二次打印649永远不打印。

 int[] array = new int[10] { 13, 2, 5, 8, 23, 90, 41, 4, 77, 61 }; for (int i = 10; i > 0; i--) { for (int j = 0; j < 9; j++) { if (array[j] > array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } 
  static bool BubbleSort(ref List myList, int number) { if (number == 1) return true; for (int i = 0; i < number; i++) { if ((i + 1 < number) && (myList[i] > myList[i + 1])) { int temp = myList[i]; myList[i] = myList[i + 1]; myList[i + 1] = temp; } else continue; } return BubbleSort(ref myList, number - 1); } 

只是另一个例子,但有一个更好的WHILE循环而不是FOR:

 public static void Bubble() { int[] data = { 5, 4, 3, 2, 1 }; bool newLoopNeeded = false; int temp; int loop = 0; while (!newLoopNeeded) { newLoopNeeded = true; for (int i = 0; i < data.Length - 1; i++) { if (data[i + 1] < data[i]) { temp = data[i]; data[i] = data[i + 1]; data[i + 1] = temp; newLoopNeeded = false; } loop++; } } } 
 public static int[] BubbleSort(int[] arr) { int length = arr.Length(); while (length > 0) { int newLength = 0; for (int i = 1; i < length; i++) { if (arr[i - 1] > arr[i]) { Swap(ref arr[i - 1], ref arr[i]); newLength = i; } } length = newLength; } } public static void Swap(ref int x, ref int y) { int temp = y; y = x; x = temp; } 

排序方向的冒泡排序 –

 using System; public class Program { public static void Main(string[] args) { var input = new[] { 800, 11, 50, 771, 649, 770, 240, 9 }; BubbleSort(input); Array.ForEach(input, Console.WriteLine); Console.ReadKey(); } public enum Direction { Ascending = 0, Descending } public static void BubbleSort(int[] input, Direction direction = Direction.Ascending) { bool swapped; var length = input.Length; do { swapped = false; for (var index = 0; index < length - 1; index++) { var needSwap = direction == Direction.Ascending ? input[index] > input[index + 1] : input[index] < input[index + 1]; if (needSwap) { var temp = input[index]; input[index] = input[index + 1]; input[index + 1] = temp; swapped = true; } } } while (swapped); } } 
  using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Practice { class Program { static void Main(string[] args) { Console.WriteLine("Enter the size"); int n = Convert.ToInt32(Console.ReadLine()); int[] mynum = new int[n]; Console.WriteLine("Enter the Numbers"); for (int p = 0; p < n;p++ ) { mynum[p] = Convert.ToInt32(Console.ReadLine()); } Console.WriteLine("The number are"); foreach(int p in mynum) { Console.WriteLine(p); } for (int i = 0; i < n;i++ ) { for(int j=i+1;jmynum[j]) { int x = mynum[j]; mynum[j] = mynum[i]; mynum[i] = x; } } } Console.WriteLine("Sortrd data is-"); foreach(int p in mynum) { Console.WriteLine(p); } Console.ReadLine(); } } } 
 int[] arr = { 800, 11, 50, 771, 649, 770, 240, 9 }; for (int i = 0; i < arr.Length; i++) { for (int j = i; j < arr.Length ; j++) { if (arr[j] < arr[i]) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } Console.ReadLine(); 
  public void BubbleSortNum() { int[] a = {10,5,30,25,40,20}; int length = a.Length; int temp = 0; for (int i = 0; i a[j]) { temp = a[j]; a[j] = a[i]; a[i] = temp; } } Console.WriteLine(a[i]); } }