快排原理
快排的核心思想是分治,从一组数组中,选择第一个数作为基数,然后从后往前遍历并和该基数做比较,若基数比该数大,则基数和该数交换位置,此时该数作为新的基数,开始从前往后遍历,若遇到比基数小的数,则该数和基数交换位置,此时该数成为新的基数,开始从后往前遍历,重复以上操作,最后会得到数组中小于一开始的那个基数的数全部在左边,大于的全部在右边,接着,递归处理左边部分的数组和右边部分的数组。
如下表格中,第一个数3为基数,则将3拿去从后往前做比较
3比1大,则3与1交换位置
此时拿1去从前往后做比较,均大于1,即一开始的那个基数3的左边均小于他,右边均大于他,则左边和右边分别为如下表格所示
重复上述遍历比较操作后,得
则该组数组的排序为
快排具体案例的使用(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());
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();
}
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);
}
}
}
}