三种排序:冒泡排序、插入排序、快速排序
规则:
冒泡排序:每一轮循环后,最大的一个数被交换到末尾,因此,下一轮循环就可以“刨除”最后的数,每一轮循环都比上一轮循环的结束位置靠前一位。
插入排序:将待排序数组分为已排序和未排序两部分,初始已排序部分只包含第一个元素。然后,从第二个元素开始,将其与已排序部分的元素依次比较,并找到合适的位置插入,使得已排序部分仍然保持有序。
快速排序:即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。
直接上代码:
创建一个控制台程序,写入代码
using System;
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> ns){
var str1 = "";
foreach (var n in ns)
{
str1 = str1 + n + ",";
}
Console.WriteLine(str1);
}
冒泡排序过程:
插入排序
快速排序
标签:arr,int,插入排序,冒泡排序,times,high,low,排序 From: https://www.cnblogs.com/luoxiaoxiao102/p/18235443