冒泡排序、插入排序、快速排序

三种排序:冒泡排序、插入排序、快速排序

规则:

冒泡排序:每一轮循环后,最大的一个数被交换到末尾,因此,下一轮循环就可以“刨除”最后的数,每一轮循环都比上一轮循环的结束位置靠前一位。

插入排序:将待排序数组分为已排序和未排序两部分,初始已排序部分只包含第一个元素。然后,从第二个元素开始,将其与已排序部分的元素依次比较,并找到合适的位置插入,使得已排序部分仍然保持有序。

快速排序:即在一个无序的序列中选取一个任意的基准元素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());
}

 

 

冒泡排序过程:

 插入排序

 快速排序

 

 

posted @ 2024-06-06 16:03  紫心落  阅读(2)  评论(0编辑  收藏  举报