随笔-0  评论-0  文章-24  trackbacks-0
  1/*
  2    名称:归并排序
  3    最坏时间复杂度(降序):O(n * lg (n))
  4    最好时间复杂度(升序):O(n)
  5*/

  6#include <iostream>
  7#include <time.h>
  8#include <stdlib.h>
  9using namespace std;
 10void mergeSort(int*int);
 11void __mergeSort(int*intint);
 12void merge(int*intintint);
 13int main(void)
 14{
 15    int n;
 16    int *array;
 17    srand(time(NULL));               /*void srand(unsigned seed);*/
 18    while (true)
 19    {
 20        cin >> n;
 21        array = new int[n];
 22        /*随机生成数组*/
 23        for (int i = 0; i < n; ++i)
 24        {
 25            array[i] = rand() % 100/*int rand(void);*/
 26        }

 27
 28        /*排序前*/
 29        for (int i = 0; i < n; ++i)
 30        {
 31            cout << array[i] << ' ';
 32        }

 33        cout << endl;
 34
 35        /*归并排序*/
 36        mergeSort(array, n);
 37
 38        /*排序后*/
 39        for (int i = 0; i < n; ++i)
 40        {
 41            cout << array[i] << ' ';
 42        }

 43        cout << endl;
 44
 45        delete array;
 46    }

 47    return 0;
 48}

 49void mergeSort(int* array, int length)
 50{
 51    __mergeSort(array, 0, length - 1);
 52}

 53void __mergeSort(int* array, int first, int last)
 54{
 55    /*只有有两个元素*/
 56    if (first < last)
 57    {
 58        int middle = first + (last - first) / 2;
 59        __mergeSort(array, first, middle);
 60        __mergeSort(array, middle + 1, last);
 61        merge(array, first, middle, last);
 62    }

 63}

 64void merge(int* array, int first, int middle, int last)
 65{
 66    int* temp = new int[last - first + 1];
 67    int i = first;
 68    int j = middle + 1;
 69    int k = 0;
 70    while (i <= middle && j <= last)
 71    {
 72        /*取较小者*/
 73        if (array[i] <= array[j])
 74        {
 75            temp[k] = array[i];
 76            ++i;
 77        }

 78        else
 79        {
 80            temp[k] = array[j];
 81            ++j;
 82        }

 83        ++k;
 84    }

 85    /*前半部分没有复制完*/
 86    if (i <= middle)
 87    {
 88        while (i <= middle)
 89        {
 90            temp[k] = array[i];
 91            ++i;
 92            ++k;
 93        }

 94    }

 95    /*后半部分没有复制完*/
 96    if (j <= last)
 97    {
 98        while (j <= last)
 99        {
100            temp[k] = array[j];
101            ++j;
102            ++k;
103        }

104    }

105    /*复制回原数组*/
106    for (int p = first, q = 0; p <= last; ++p, ++ q)
107    {
108        array[p] = temp[q];
109    }

110    /*释放内存*/
111    delete temp;
112}
posted on 2012-10-21 23:46 zhuxin 阅读(229) 评论(0)  编辑 收藏 引用 所属分类: 排序算法

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理