数据结构作业(五):直接插入排序 和 归并排序

好家伙,写作业

 

1.直接插入排序

这是个非常简单的排序

将一串数分为有序区和无序区

然后将无序区的数一个个按照正确的顺序放到有序区

 

 2.归并排序

将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

若将两个有序表合并成一个有序表,称为二路归并。

 

 

 

其中我们要解决的一个关键问题就是:

如何将两个有序序列合并成一个有序序列?

现在我们假设两个有序序列R[low]~[mid]、R[mid+1]~R[high]

 

void Merge(list R,list R1,int low,int mid,int high) {
//合并R[low]~[mid]、R[mid+1]~R[high],结果在R1中
    int i,j,k;
    i=low; 
    j=mid+1;
    k=low;
    while(i<=mid && j<=high)
    { 
    if(R[i]<=R[j]){
        R1[k]=R[i];
        i++;
        }//小者先入 
    else{
        R1[k]=R[j];
        j++;
        } 
    } 
    while(i<=mid) R1[k++]=R[i++];//复制左子表剩余
    while(j<=high)) R1[k++]=R[j++];//复制右子表剩余
} 

 

 

 

 

 

作业题目如下:

对于给定的一组关键字:503,87,512,61,908,170,897,275,653,462,

请首先分别写出运用直接插入排序得到的每趟的结果。然后运用代码实现归并排序。

 

代码如下:

#include <iostream>

using namespace std;

//归并排序 
void mergeArr(int arr[], int low, int mid, int hight) {
    int* tempArr = new int[hight - low + 1];
    int i = low, j = mid + 1, k = 0;
    while (i <= mid && j <= hight) {
        if (arr[i] < arr[j]) {
            tempArr[k] = arr[i];
            i++;
        }
        else {
            tempArr[k] = arr[j];
            j++;
        }
        k++;
    }
    // 如果 arr[low] 到 arr[mid] 区间中的数组还没有比较完成 ,直接复制到tempArr 中
    while (i <= mid) {
        tempArr[k] = arr[i];
        i++;
        k++;
    }
    // 如果 arr[mid+1] 到 arr[hight] 区间中的数组还没有比较完成 ,直接复制到tempArr 中
    while (j <= hight) {
        tempArr[k] = arr[j];
        j++;
        k++;
    }
    // 比较完成之后 将原本的数组arr 下标 low-hight 对应的内容 进行改变
    i = low;
    for (int tempK = 0;((tempK < k)&&(i<=hight));tempK++) {
        arr[i] = tempArr[tempK];
        i++;
    }
    delete[] tempArr;
    tempArr = NULL;
    
}

void sortArr(int arr[], int low, int hight) {
    if (low < hight) {
        int mid = (hight + low) / 2;
        sortArr(arr,low,mid);// 递归拆解左边的序列
        sortArr(arr, mid + 1, hight);// 递归拆解左边的序列
        mergeArr(arr, low, mid, hight);// 将两个有序的子序列(arr[low至mid]、arr[mid+1至hight] 排序合并成一个新的有序列
    }
}

//直接插入排序 
void InsertSort(int a[],int l){
    int temp;
    int j;
    cout<<"直接插入排序每次排序后数据如下:" <<endl;
    for(int i=1;i<l;i++)
    {
        if(a[i]<a[i-1])
        {
            temp=a[i];
            for(j=i-1;j>=0&&temp<a[j];j--)
            {
                a[j+1]=a[j];
            }
            a[j+1]=temp;

        }
        
        for(int k=0;k<l;k++)
        {
             cout<<a[k]<<" ";
        }
        cout<<endl;

    }
}


int main()
{
    int a[10]={503,87,512,61,908,170,897,275,653,462};
    int len=9;
    InsertSort(a,len);
    
    sortArr(a,0,9);
    cout << endl << "归并排序后" << endl;
    for (int j = 0;j <9;j++) {
        cout << a[j] << " ";
    }
    return 0;
}

 

posted @ 2023-01-03 23:46  养肥胖虎  阅读(119)  评论(0编辑  收藏  举报