static void Main(string[] args)
{
int[] datas = new int[100000];
for (int j = 0; j < 100000; j++) {
datas[j] = r.Next(1, 10000);
}
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
sortArray(0, datas.Length - 1, datas);
stopwatch.Stop();
foreach (int data in datas) {
Console.WriteLine(data);
}
Console.WriteLine("是否排序好:" + isSort(datas));
Console.WriteLine("运行时间:" + stopwatch.ElapsedMilliseconds);
Console.ReadKey();
}
static void sortArray(int start,int end,int[] datas) {
if (start >= end) {
return;
}
int i = start;
int j = end;
//左边参考值 ,从小到大排序
int refer = datas[start];
while (i != j) {
//先搜索比参考值小的
while (datas[j] >= refer && j > i)
{
j--;
}
while (datas[i] <= refer && i < j) {
i++;
}
if (i < j) {
//交换
int temp = datas[i];
datas[i] = datas[j];
datas[j] = temp;
}
}
//把参考值放到中间相撞位置
datas[start] = datas[i];
datas[i] = refer;
sortArray(start, i - 1, datas);
sortArray(i + 1, end, datas);
}
static bool isSort(int[] datas) {
for (int i = 0; i < datas.Length -1; i++) {
if (datas[i] > datas[i + 1]) {
return false;
}
}
return true;
}思想就是,先定一个参考值(左边参考值或右边参考值),这个左右边参考值涉及到先搜索比参考值小的还是比参考值大的。例如,先定一个左边参考值,从右边搜索比参考值小的,再从数据左边开始搜索比参考值大的,然后交换这两个值,一直到这两个搜索撞到了一起。而这个撞在一起的值,就是那个先搜索的(比参考值小),让参考值归为到中间,因为选取参考值时是选取的左边位置,所以,直接交换中间相撞位置和参考值位置就行了。同理的,选取右边参考的话,就要先搜索左边的,先搜索比参考值大的。
模拟排序10W条随机数据用时:20ms,快得飞起啊,而且空间复杂度也低