合并排序
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(归并排序)


首页 我的博客
粤ICP备17103704号