冒泡排序、插入排序、快速排序
三种排序:冒泡排序、插入排序、快速排序
规则:
冒泡排序:每一轮循环后,最大的一个数被交换到末尾,因此,下一轮循环就可以“刨除”最后的数,每一轮循环都比上一轮循环的结束位置靠前一位。
插入排序:将待排序数组分为已排序和未排序两部分,初始已排序部分只包含第一个元素。然后,从第二个元素开始,将其与已排序部分的元素依次比较,并找到合适的位置插入,使得已排序部分仍然保持有序。
快速排序:即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。
直接上代码:
创建一个控制台程序,写入代码
using System; using System.Text; using System.Text.Json.Nodes; using Org.BouncyCastle.Security; using Org.BouncyCastle.Utilities; Sort_Bubble();//冒泡排序 Sort_Insert();//插入排序 Sort_Quick();//快速排序 //冒泡排序 void Sort_Bubble() { Console.WriteLine("冒泡排序"); List<int> arr = new List<int>() { 28, 12, 89, 73, 65, 18, 96, 50, 8, 36 }; // 排序前: PrintStr(arr); int times = 0; for (int i = 0; i < arr.Count - 1; i++) { for (int j = 0; j < arr.Count - i - 1; j++) { if (arr[j] > arr[j + 1]) { // 交换 int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } PrintStr(arr); times++; } } // 排序后: PrintStr(arr); Console.WriteLine("排序次数:"+times); } //插入排序 void Sort_Insert() { Console.WriteLine("插入排序"); List<int> arr = new List<int>() { 28, 12, 89, 73, 65, 18, 96, 50, 8, 36 }; // 排序前: PrintStr(arr); int times = 0; for (int i = 0; i < arr.Count - 1; i++) { for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--) { // 交换 int tmp = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = tmp; PrintStr(arr); times++; } } // 排序后: PrintStr(arr); Console.WriteLine("排序次数:" + times); } //快速排序 void Sort_Quick() { Console.WriteLine("快速排序"); List<int> arr = new List<int>() { 28, 12, 89, 73, 65, 18, 96, 50, 8, 36 }; // 排序前: PrintStr(arr); int times = 0; Sort(arr, 0, arr.Count - 1, ref times); // 排序后: PrintStr(arr); Console.WriteLine("排序次数:" + times); } void Sort(List<int> arr, int low, int high, ref int times) { if (low >= high) return; Console.WriteLine("打印数组:"); PrintStr(arr); var a = arr[low]; Console.WriteLine("寻找" + a + "的位置"); int index = SortUnit(arr, low, high, ref times); Console.WriteLine(a + "的位置为[" + index + "]"); Console.WriteLine(arr[index] + "左边排序"); /*对左边单元进行排序*/ Sort(arr, low, index - 1, ref times); Console.WriteLine(arr[index] + "右边排序"); /*对右边单元进行排序*/ Sort(arr, index + 1, high, ref times); } int SortUnit(List<int> arr, int low, int high, ref int times) { int key = arr[low]; while (low < high) { while (arr[high] >= key && low < high) high--; /*比key小的放左边*/ arr[low] = arr[high]; arr[high] = key; PrintStr(arr); times++; /*从前向后搜索比key大的值,比key大的放右边*/ while (arr[low] <= key && low < high) ++low; /*比key大的放右边*/ arr[high] = arr[low]; arr[low] = key; PrintStr(arr); times++; } return high; } //输出 void PrintStr(List<int> arr){ StringBuilder sb = new StringBuilder(); foreach (var a in arr) { sb .Append( a + ","); } Console.WriteLine(sb.ToString()); }
冒泡排序过程:
插入排序
快速排序