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

数据结构,作业,直接,插入排序,归并,排序 · 浏览次数 : 73

小编点评

**直接插入排序** 每次排序后数据如下: 503 512 61 87 897 170 275 462 908 **归并排序** 首先,我们对两个有序序列进行分和,然后我们依次将两个序列的元素合并到一个新的有序序列中。 * **分**: * 将两个序列的元素依次加入一个新的序列中,直到其中一个序列为空。 * 如果两个序列长度不同,我们将丢弃 shorter 的序列。 * **合并**: * 将两个序列的元素从右往左依次取出并合并到新序列中。 * 对于合并时,如果两个元素的值相同,则选择更小的元素。 **代码** ```c++ #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); } } //直接插入排序 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;} ```

正文

好家伙,写作业

 

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;
}

 

与数据结构作业(五):直接插入排序 和 归并排序相似的内容:

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

好家伙,写作业 1.直接插入排序 这是个非常简单的排序 将一串数分为有序区和无序区 然后将无序区的数一个个按照正确的顺序放到有序区 2.归并排序 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。 若将两个有序表合并成一个有序表,称为二路归并。 其中我们要解决的一个

数据结构与算法大作业:走迷宫程序(C语言,DFS)(代码以及思路)

好家伙,写大作业,本篇为代码的思路讲解 1.大作业要求 走迷宫程序 问题描述: 以一个 m * n 的长方阵表示迷宫, 0和1分别表示迷宫的通路和障碍。 设计一个程序, 对任意设定的迷宫, 求出一条从入口到出口的通路, 或得出没有通路的结论。 基本要求: (1) 实现一个以链表做存储的栈类型, 然后

数据结构与算法大作业:走迷宫程序(实验报告)

好家伙,本篇为应付老师的实验报告,有需要的拿去抄吧 思路讲解在上一篇: 数据结构与算法大作业:走迷宫程序(C,代码以及思路) 一、作业目的 1、 掌握用数据结构的知识进行程序设计。 2、 应用所学的数据结构完成一个具有一定实际意义的应用程序的设计、编码、调试,锻炼实践动手能力,提高编程水平。 二、作

整理并发布本科四年的课程资料

可恶,我的本科课程资料 repo 已发布半年,但是发现的人实在是太少了。 如此高质量的课程资料,埋没在互联网中实在可惜,于是写一篇博客引流→ tag: 东南大学 | 计算机科学与技术 | 09 系 | 2019 级 | 专业课 | 往年真题 | 课程笔记 | 期末大作业 数据结构 | 计算机组成原理

建设数字工厂:华为云数字工厂平台接入第三方网关设备数据

摘要:本期介绍工业自动化产线设备由第三方数采网关(软件)采集数据后,如何快速接入到华为云数字工厂平台,实现生产自动化控制层与数字工厂应用层的数据集成和实时交互。 本文分享自华为云社区《数字工厂深入浅出系列(五):接入第三方网关设备数据》,作者: 云起MAE。 华为云数字工厂平台内置工业IoT数据引擎

数据结构(四):(顺序表)设计算法删除所有数字字符

好家伙,写作业 什么是顺序表: 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、 使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系, 采用顺序存

VUEX 使用学习五 : getter

转载请注明出处: Getter对Store中的数据进行加工处理形成新的数据。他不会修改state中的原始数据,起到的是包装数据的作用; 有时我们需要从 store 中的 state 中派生出一些状态,例如对列表进行过滤并计数 如果有多个组件需要用到此属性,我们要么复制这个函数,或者抽取到一个共享函数

架构设计(五):有状态服务和无状态服务

架构设计(五):有状态服务和无状态服务 作者:Grey 原文地址: 博客园:架构设计(五):有状态服务和无状态服务 CSDN:架构设计(五):有状态服务和无状态服务 无状态的服务 在横向扩展服务的过程中,将状态(例如用户会话数据)从服务中移出并将会话数据存储在持久性存储介质中,如关系型数据库或 No

项目管理之八大绩效域------笔记(五)

18.7 度量绩效域 度量绩效域涉及评估项目绩效和采取应对措施相关的活动和职能度量是评估项目绩效,并采取适当的应对措施,以保持最佳项目绩效的过程。 一、 预期目标: ①对项目状况充分理解;(随时对项目有充分了解) ②数据充分,可支持决策; ③及时采取行动,确保项目最佳绩效; ④能够基于预测和评估作出

云小课|MRS数据分析-通过Spark Streaming作业消费Kafka数据

阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击此处。 摘要:Spark Streaming是一种构建在Spark上的实时计算框架,扩展了Spark处理大规模流式数据的能力。本文介