快速排序简称拔萝卜排序(以升序为例)。先选定一个萝卜把他拔出来(以第一个坑为例),然后从最后一个坑开始看,那个萝卜比拔出来的小,就把他拔出来放到没萝卜的那个坑,然后又从第一个开始找比它大的填到那个坑。。。。第一个拔出来的萝卜等到左边的萝卜都比右边的大他就放进相遇的那个坑,再并发左边萝卜和右边萝卜。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QuickSort
{
class Program
{
//数组是我随便打的
//至于语言稍作修改都可运行
public static int[] arr = { 123, 3, 5, 3, 132, 1, 565656, 735, 5, 5, 9999, 5555, 35, 35, 35, 35, 3, 135, 35, 2625256, 333, 356356356, 353565123, 357565635, 1213 };
static void Main(string[] args)
{
adjust(0,arr,arr.Length-1);
foreach (var item in arr)
Console.Write(item+" ");
Console.WriteLine("");
Myqsort2(0, arr, arr.Length - 1);
foreach (var item in arr)
Console.Write(item + " ");
}
public static void adjust(int l,int[] arr,int r)
//这里是第n次排序好了之后并发左边和右边
{
if (l < r)
{
int i = Myqsort(l, arr, r);
adjust(l, arr, i - 1);
adjust(i + 1, arr, r);
}
}
public static int Myqsort(int l, int[] arr,int r)
{
int le = l, ri = r;
int x = arr[l];
while(le<ri)//左边和右边相遇就停止,代表本次已经排好了
{
while(ri>le)//先从后面后开始找,找到就置换然后跳出
{
if(x>arr[ri])
{
arr[le] = arr[ri];
break;
}
ri--;
}
while (ri > le)//再从前面找找到就置换然后跳出
{
if(x<arr[le])
{
arr[ri] = arr[le];
break;
}
le++;
}
}
arr[ri] = x;//最后把萝卜放入到那个坑里面
return ri;
}
public static void Myqsort2(int l, int[] arr,int r)
{
//这里是两个合一的版本
if (l < r)
{
int le = l, ri = r;
int x = arr[l];
while (le < ri)
{
while (ri > le)
{
if (x > arr[ri])
{
arr[le] = arr[ri];
break;
}
ri--;
}
while (ri > le)
{
if (x < arr[le])
{
arr[ri] = arr[le];
break;
}
le++;
}
}
arr[ri] = x;
int i= ri;
Myqsort2(l, arr, i - 1);
Myqsort2(i + 1, arr, r);
}
}
}
}
贴出学习网址芜湖起飞