C++归并排序练习

归并排序实质是将一个无序数组拆分成多个数组再分别排序,再通过对比合并成一个有序数组

#include<iostream>
#include<ctime>
using namespace std;

#define number 100

int main()
{
    srand((unsigned int)time(NULL));
    int arr[number];
    int flag=0;
    //生成随机数组
    for (int i = 0; i < number; i++)
    {
        //生成1~10随机数
        arr[i]=rand()%number+1;
        //显示生成的随机数组
        cout<<arr[i]<<"\t";
        flag++;
        if ((flag%10) == 0)
        {
            cout<<endl;
        }
    }
    
    int low = 0;            //起始低位
    int mid=number/2;       //中间位
    int high=mid;    //起始高位
    int tmp=0;
    int j=0;
    //先使用插入排序前半段
    for (int i = 1; i < mid; i++)
    {
        tmp = arr[i];
        for ( j = i - 1;((j >= 0) && (arr[j] > tmp));j--)
        {
            arr[j + 1] = arr[j];
        }
        arr[j + 1] = tmp;
    }

    //先使用插入排序后半段
    for (int i = mid+1; i < number; i++)
    {
        tmp = arr[i];
        for ( j = i - 1;((j >= mid)&& (arr[j] > tmp));j--)
        {
            arr[j + 1] = arr[j];
        }
        arr[j + 1] = tmp;
    }

    //归并排序
    int temp[number]={0};
    int k = 0;
    while (low < mid && high < number)  //低位和高位相比较,谁小谁就被拿进temp数组
    {
        if (arr[low] <= arr[high])
        {
            temp[k] = arr[low];
            k++;
            low++;
        }
        else
        {
            temp[k] = arr[high];
            k++;
            high++;
        }
    }

    //将剩下的有序的数据存入tmp数组中
    while (low < mid)
    {
        temp[k] = arr[low];
        k++;
        low++;
    }
    while (high < number)
    {
        temp[k] = arr[high];
        k++;
        high++;
    }

    //将tmp数组中的元素拷贝到原数组中
    k = 0;
    int i = 0;
    while (i < number)
    {
        arr[i] = temp[k];
        i++;
        k++;
    }
 
    //显示有序的数组
    cout<<"-----------------------"<<endl;
    for (int i = 0; i < number; i++)
    {
        cout<<arr[i]<<"\t";
        flag++;
        if ((flag%10) == 0)
        {
            cout<<endl;
        }
    }
    return 0;
}

 

posted @ 2020-08-18 16:16  归江渡鸟泅白浪  阅读(197)  评论(0)    收藏  举报