前边几篇文章介绍了几种排序的算法,并且针对某些算法做了优化。这篇文章介绍一种比较快速的排序算法:快速排序,可以说是冒泡排序的改进。原理是就是找出一个基准数,然后将小于该数的数字放到左边,大于该数的数字放到右边,这样就完成一轮快速排序,然后左边部分和右边部分分别再进行快速排序,如此递归执行,只有一个数字时就排序完毕了。
看一个标准的实现:
static void QuickSort(int[] intArr)
{
int numberOfLoop = 0;//循环次数
int numberOfSwap = 0;//交换次数
QSort(intArr, 0, intArr.Length - 1, ref numberOfLoop, ref numberOfSwap);
}
static void QSort(int[] intArr, int left, int right, ref int numberOfLoop, ref int numberOfSwap)
{
//如果只有一个元素,就不用排序了
if (left < right) {
//方法一:取第一个数作为基数
int middle = intArr[left];
//使用i,j代替left,right
int i = left;
int j = right;
//从后往前找小middle的第一个数,j--
while (j > i)
{
numberOfLoop++;
//如果intArr[j]<middle,则将intArr[j]提前,与i进行交换
if (intArr[j] < middle)
{
numberOfSwap++;
int temp = intArr[i];
intArr[i] = intArr[j];
intArr[j] = temp;
//i已经被替换了,再比较也不会大于middle,所以自动加1
i++;
//从i开始查找大于middle的第一个数,i++
while (i < j)
{
//如果找到,则将intArr[i]与intArr[j]交换,并跳出内循环
if (intArr[i] > middle)
{
numberOfSwap++;
temp = intArr[j];
//此时intArr[j]已经大于middle
intArr[j] = intArr[i];
intArr[i] = temp;
break;
}
//如果找到大于middle的数,i++肯定不会执行了,如果找不到,每次都执行
i++;
}
}
else
{
//重复执行从后到前 从前到后的操作
j--;
}
}
if (left != i)
{
QSort(intArr, left, i, ref numberOfLoop, ref numberOfSwap);
QSort(intArr, j, right, ref numberOfLoop, ref numberOfSwap);
}
else//某些情况下,循环没有找到小于middle的值
{
QSort(intArr, ++i, right, ref numberOfLoop, ref numberOfSwap);
}
}
}
理解起来稍微有些复杂,就是从后到前找一个比基准数小的值,从前到后找一个比基准数大的值。分别与当前的i值和j值做交换,目的就是将小数放到基准数的前边,大数放到基准数的后边,分成两组,然后分组继续快速排序。
可以对交换部分做一定的改进:
//方法二:
//左边索引小于右边,则还未排序完成
//取中间的元素作为比较基准,小于他的往左边移,大于他的往右边移
int middle = intArr[(left + right) / 2];
int i = left - 1;
int j = right + 1;
while (true)
{
//从前至后找到大于middle的第一个数,跳出条件是大于等于middle
while (intArr[++i] < middle) ;
//从后至前找到小于middle的第一个数,跳出条件是小于等于middle
while (intArr[--j] > middle) ;
if (i >= j)
break;
//把小数放到前边
int temp = intArr[i];
intArr[i] = intArr[j];
intArr[j] = temp;
}
//分组递归快速排序
QSort(intArr, left, i - 1, ref numberOfLoop, ref numberOfSwap);
QSort(intArr, j + 1, right, ref numberOfLoop, ref numberOfSwap);
这样就看着简介多了,更容易理解。
经测试,快速排序的效率明显高于前面介绍的接种基本排序方式。

发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论