C#实现快速排序(通俗易懂)

快排原理

快排的核心思想是分治,从一组数组中,选择第一个数作为基数,然后从后往前遍历并和该基数做比较,若基数比该数大,则基数和该数交换位置,此时该数作为新的基数,开始从前往后遍历,若遇到比基数小的数,则该数和基数交换位置,此时该数成为新的基数,开始从后往前遍历,重复以上操作,最后会得到数组中小于一开始的那个基数的数全部在左边,大于的全部在右边,接着,递归处理左边部分的数组和右边部分的数组。

如下表格中,第一个数3为基数,则将3拿去从后往前做比较

32185
3比1大,则3与1交换位置
12385
此时拿1去从前往后做比较,均大于1,即一开始的那个基数3的左边均小于他,右边均大于他,则左边和右边分别为如下表格所示
12
85
重复上述遍历比较操作后,得
12
58
则该组数组的排序为
12358

快排具体案例的使用(C#实现)

例题:已知有一个排序好的数组,此时再给你一个新的数字,写一个方法有序插入数字到数组中,效率越高越好。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sort
{
    class Program
    {
        //自由输入一组数组
        static void Main(string[] args)
        {
            int[] arr;
            Console.WriteLine("请输入数组的长度:");
            int length = Convert.ToInt32(Console.ReadLine());
            //Console.ReadLine() 会等待直到用户按下回车,一次读入一行
            //Convert.ToInt32()将数字的指定字符串表示形式转换为等效的 32 位有符号整数
            arr = new int[length];
            for (int i = 0; i < length; i++)
            {
                Console.WriteLine("请输入第{0}个数:", i + 1);
                arr[i] = Convert.ToInt32(Console.ReadLine());

            }
            int min = 0;
            int max = arr.Length - 1;
            sort(arr, min, max);
            foreach (int i in arr)
            {
                Console.WriteLine(i);

            }
            Console.ReadKey();
            //Console.ReadKey(); 则是等待用户按下任意键,一次读入一个字符。
        }

        public static void sort(int[] array, int min, int max)
        {
            int key = array[min]; //数组的首位作为基数
            int start = min;      //从前往后遍历标识位
            int end = max;        //从后往前遍历标识位
            //两个标识位还未相遇,即基数的左边还未全小于基数,右边还未全大于基数
            while (end > start)
            {   
                //从后往前遍历没有遇到比基数大的
                while (end > start && array[end] >= key)
                {
                    end--;
                }
                //当遇到比基数大时,互相交换位置
                if (key > array[end])
                {
                    int temp = array[end]; 
                    array[end] = array[start];
                    array[start] = temp;
                }
                //从前往后遍历,没有比新基数小的数
                while (end > start && array[start] <= key)
                {
                    start++;
                }
                //当遇到比新基数小时,互相交换位置
                if (key < array[start])
                {
                    int temp = array[start];
                    array[start] = array[end];
                    array[end] = temp;
                }
            }
            //此时基数的左边全小于基数,右边全大于基数,利用递归思路
            //排序左边部分
            if (start > min)
            {
                sort(array, min, start - 1);
            }
            //排序右边部分
            if (end < max)
            {
                sort(array, end + 1, max);
            }
        }
    }
}
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值