static void Main(string[] args)
{
//随机10W个数据
int[] datas = new int[100000];
Random r = new Random();
for (int i = 0; i < 100000; i++) {
datas[i] = r.Next(1,10000);
}
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
sort(datas);//排序
stopwatch.Stop();
foreach (var data in datas) {
Console.WriteLine(data);
}
Console.WriteLine();
Console.WriteLine("用时:" + stopwatch.ElapsedMilliseconds);
Console.ReadKey();
}
static void sort(int[] datas) {
int length = datas.Length;
int[] temp = new int[length];
sort(datas, 0, length - 1, temp);
}
static void sort(int[] datas,int left,int right,int[] temp) {
if (left < right) {
int mid = (left + right)/2;
//拆分
sort(datas, left, mid, temp);
sort(datas, mid + 1, right, temp);
//合并,拆到不能拆就合并
merge(datas, left, mid, right, temp);
}
}
static void merge(int[] datas, int left, int mid, int right, int[] temp) {
int i = left;
int j = mid + 1;
int t = 0;
//对比左右两边(两边都已经是有序的了,所以从左往右对比),排序(谁小先)填充到临时数组
while (i <= mid && j <= right) {
if (datas[i] < datas[j])
{
temp[t++] = datas[i++];
}
else {
temp[t++] = datas[j++];
}
}
//填充剩下了
while (i <= mid) {
temp[t++] = datas[i++];
}
while (j <= right) {
temp[t++] = datas[j++];
}
//将排序好的临时数据覆盖到原来的数组中
t = 0;
while (left <= right) {
datas[left++] = temp[t++];
}
}思想:将数据一直对半分组,分到组的数据都排序好为止(1个数据肯定是排序好的),再将相邻的组合并起来(边合并,边排序),合并成的组又是一个排序好的组。
时间复杂度:O(nlogn)
10W个随机数据排序用时:33ms
稳定而又快速的排序方法,参考:dreamcatcher-cx(归并排序)