快速排序的实现原理: 拿第一个数为基准、从后往前比较、比它小的就放在前面。然后从前往后比较,比它大的放在后面。一直找到中间的位置,就把基准数放在中间的位置。这样基准数左边就是小的数、右边就是比基准数大的数。
1、取出数组中的第一个元素作为基准数、比它小的放左边。比它大的放右边。
2、通常取第一个下标的数为基准数、从后往前开始比较,比它小的放在该基准数的位置。再从前往后开始,比它大的放在第二个位置。以此类推。当从前往后与从后往前的两组下标相遇,则该趟结束。
为什么要找小的数要从后往前查找?因为后面存放的肯定是大的数,可以过滤一遍小的数。
3、使用递归、重复进行第二部操作。
代码实现:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _008_快速排序 {
class Program {
/// <summary>
/// 对数组dataArray中索引从left到right之间的数做排序
/// </summary>
/// <param name="dataArray">要排序的数组</param>
/// <param name="left">要排序数据的开始索引</param>
/// <param name="right">要排序数据的结束索引</param>
static void QuickSort(int[] dataArray, int left, int right)
{
if (left < right) // 排序必须符合的条件
{
int x = dataArray[left];//基准数, 把比它小或者等于它的 放在它的左边,然后把比它大的放在它的右边
int i = left;
int j = right;//用来做循环的标志位
while (true &&i<j )//当i==j的时候,说明我们找到了一个中间位置,这个中间位置就是基准数应该所在的位置
{
//从后往前比较(从右向左比较) 找一个比x小(或者=)的数字,放在我们的坑里 坑位于i的位置
while (true && i < j) { //i<j 防止死循环越界 防止j--一直越界
if (dataArray[j] <= x) //找到了一个比基准数 小于或者等于的数子,应该把它放在x的左边
{
dataArray[i] = dataArray[j]; //将比基准数小的放在挖的坑的位置、然后跳出循环
break;
} else {
j--;//向左移动 到下一个数字,然后做比较
}
}
//从前往后(从左向右)找一个比x大的数字,放在我们的坑里面 现在的坑位于j的位置
while (true && i < j) { //i<j 防止死循环越界 防止i++一直越界
if (dataArray[i] > x) {
dataArray[j] = dataArray[i];
break;
} else {
i++;
}
}
}
//跳出循环 现在i==j i是中间位置
dataArray[i] = x;// left -i- right
QuickSort(dataArray,left,i-1);
QuickSort(dataArray,i+1,right);
}
}
static void Main(string[] args) {
int[] data = new int[] { 42, 20, 17, 27, 13, 8, 17, 48 };
QuickSort(data,0,data.Length-1);
foreach (var temp in data) {
Console.Write(temp + " ");
}
Console.ReadKey();
}
}
}