`

数据结构之排序的实现

阅读更多

1、插入排序

 

void InsertSort(RecType R[],int n){
    int i,j,k;
    RecType temp;
    for (i=1; i<n; i++) {
        temp=R[i];
        j=i-1;
        while (j>=0&&temp.key<R[j].key) {
            R[j+1]=R[j];
            j--;
        }
        R[j+1]=temp;
   
       printf("    i=%d  ",i);
       for (k=0; k<n; k++) {
           printf("%3d",R[k].key);
        }
        printf("\n");
    }
    
}

 2、冒泡排序

 

void BubbleSort(RecType R[],int n){
    int i,j,k;
    RecType temp;
    for (i=0; i<n-1; i++) {
        for (j=n-1; j>i; j--) {
            if(R[j].key<R[j-1].key){
                temp=R[j];
                R[j]=R[j-1];
                R[j-1]=temp;
            
            }
        }
        printf("  i=%d:    ",i);
        for (k=0; k<n; k++) {
            printf("%2d",R[k].key);
        }
        printf("\n");
    }
}

 

3、选择排序

 

void SelectSort(RecType R[],int n){
    int i,j,k;
    RecType temp;
    for (i=0; i<n-1; i++) {
        k=i;
        for (j=i+1; j<n; j++) {
            if(R[j].key<R[k].key){
                k=j;
            }
        }
        if(k!=i){
            temp=R[i];
            R[i]=R[k];
            R[k]=temp;
        }
        printf("  i=%d:    ",i);
        for (k=0; k<n; k++) {
            printf("%2d",R[k].key);
        }
        printf("\n");
    }
}

 4、希尔排序

 

void ShellSort(RecType R[],int n){
    int i,j,d,k;
    RecType temp;
    d=n/2;
    while (d>0) {
        for (i=d; i<n; i++) {
            j=i-d;
            while (j>=0&&R[j].key>R[j+d].key) {
                temp=R[j];
                R[j]=R[j+d];
                R[j+d]=temp;
                j=j-d;
            }
        }
   
       printf("  d=%d:    ",d);
       for (k=0; k<n; k++) {
           printf("%3d",R[k].key);
       }
       printf("\n");
       d=d/2;
  }
}

 

5、快速排序

 

void QuickSort(RecType R[],int s,int t){
    int i=s,j=t,k;
    RecType temp;
    if(s<t){
        temp=R[s];
        while(i!=j){
            while(j>i&&R[j].key>temp.key)
                   j--;
            if(i<j){
                R[i]=R[j];
                i++;
            }
            while(i<j&&R[i].key<temp.key)
                i++;
            if(i<j){
                R[j]=R[i];
                j--;
            }
        }
        R[i]=temp;
        printf("      ");
        for(k=0;k<10;k++){
            if(k==i){
                printf(" [%d]",R[k].key);
            }else{
                printf("%4d",R[k].key);
            }
        }
        printf("\n");
        
        QuickSort(R,s,i-1);
        QuickSort(R,i+1,t);
    
    }
}
 

6、堆排序

 


void Sift(RecType R[],int low,int high){

    int i=low,j=2*i;
    RecType temp=R[i];
    while(j<=high){
        if(j<high&&R[j].key<R[j+1].key){
            j++;
        }
        if(temp.key<R[j].key){
            R[i]=R[j];
            i=j;
            j=2*i;
        }else{
            break;
        }
    }
    R[i]=temp;
}
void HeapSort(RecType R[],int n){
    int i;
    RecType temp;
    for(i=n/2;i>=1;i--)
        Sift(R,i,n);
    printf("初始堆: ");DispHeap(R,1,n);printf("\n");
    for (i=n; i>=2; i--) {
        printf("交换%d与%d,输出%d\n",R[i].key,R[1].key,R[1].key);
        temp=R[1];
        R[1]=R[i];
        R[i]=temp;
        Sift(R,1,i-1);
        printf("筛选调整得到堆:");
        DispHeap(R,1,i-1);
        printf("\n");
    }
     
}

 

7、归并排序

 

 

void Merge(RecType *R,int low,int m,int high)
{//将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的子文件R[low..high]
    int i=low,j=m+1,p=0; //置初始值
    RecType *R1; //R1是局部向量
    R1=(RecType *)malloc((high-low+1)*sizeof(RecType));
    if(!R1)return; //申请空间失败
    while(i<=m&&j<=high) //两子文件非空时取其小者输出到R1[p]上
        R1[p++]=(R[i].key<=R[j].key)?R[i++]:R[j++];
    while(i<=m) //若第1个子文件非空,则复制剩余记录到R1中
        R1[p++]=R[i++];
    while(j<=high) //若第2个子文件非空,则复制剩余记录到R1中
        R1[p++]=R[j++];
    for(p=0,i=low;i<=high;p++,i++)
        R[i]=R1[p];//归并完成后将结果复制回R[low..high]
}

void MergeSort(RecType R[],int low,int high)
{//用分治法对R[low..high]进行二路归并排序
    int mid;
    if(low<high){//区间长度大于1
        mid=(low+high)/2;//分解
        MergeSort(R,low,mid);//递归地对R[low..mid]排序
        MergeSort(R,mid+1,high); //递归地对R[mid+1..high]排序
        Merge(R,low,mid,high);//组合,将两个有序区归并为一个有序区
    }
}
 
分享到:
评论

相关推荐

    数据结构排序问题实现总结.doc

    本资料重点讨论了数据结构中的排序问题及其实现。 排序是数据处理的基础操作之一,它将无序的元素序列转换为有序序列。在数据结构中,有多种排序算法,每种算法都有其独特的性能特征。例如,冒泡排序是一种简单的...

    数据结构各种排序算法实现及比较

    数据结构各种排序算法实现及比较 在本文中,我们将讨论各种排序算法的实现和比较,包括简单选择排序、直接插入排序、希尔排序、冒泡排序、快速排序等。这些算法都是数据结构课程设计报告中常用的排序算法。 简单...

    数据结构之二叉排序树的生成

    在“数据结构之二叉排序树的生成”这个程序中,我们可以深入理解二叉排序树的构建过程和相关操作。首先,我们需要初始化一个空的二叉树。这通常通过创建一个空的根节点来实现,根节点没有左右子节点。初始化操作是...

    算法:C语言实现第1-4部分基础知识、数据结构、排序及搜索

    本资源“算法:C语言实现第1-4部分基础知识、数据结构、排序及搜索”涵盖了C语言编程的基础知识,以及在计算科学中至关重要的数据结构、排序和搜索算法。 首先,基础知识部分主要涉及C语言的语法、变量、控制结构...

    数据结构中几种排序的实现

    数据结构中几种排序的实现 数据结构中几种排序的实现

    数据结构实验——排序

    一、实验目的 1、掌握排序的不同方法,并能用高级语言实现排序算法 二、实验内容 1、实现希尔排序算法。

    算法:算法C语言实现 第1-4部分 基础知识、数据结构、排序及搜索

    算法:C语言实现 (第1-4部分)基础知识、数据结构、排序及搜索(原书第3版) 本书是Sedgewick彻底修订和重写的C算法系列的第一本。全书分为四部分,共16章。第一部分“基础知识”(第1—2章)介绍基本算法分析原理。...

    C++实现数据结构排序代码

    在IT领域,排序是计算机科学中最基础且重要的概念之一,特别是在数据结构和算法的设计中。本文将详细讨论C++实现的几种主要排序算法,包括冒泡排序、插入排序、堆排序、选择排序、快速排序以及希尔排序。这些排序...

    数据结构试验 排序问题 C语言 源代码

    本主题主要聚焦于数据结构试验中的排序问题,通过C语言来实现内部排序算法。下面将详细介绍这些概念及其相关知识。 首先,数据结构是组织、管理、存储和检索数据的方式,它能有效地提高数据处理的效率。在数据结构...

    算法:C语言实现++第1-4部分++基础知识、数据结构、排序及搜索

    《算法:C语言实现(第1-4部分)基础知识、数据结构、排序及搜索(原书第3版)》细腻讲解计算机算法的C语言实现。全书分为四部分,共16章。包括基本算法分析原理,基本数据结构、抽象数据结构、递归和树等数据结构知识,...

    数据结构堆排序

    总结来说,堆排序是一种利用堆数据结构进行排序的有效方法,它包括了建堆和调整堆两个关键步骤。在C++中,堆排序可以通过自定义函数实现,如`heapify()`、`buildHeap()`和`heapSort()`。理解并实践这些函数的编写,...

    西南交通数据结构内部排序-多种排序算法的实现.docx

    通过这个实验,学生可以深入理解四种排序算法的原理,学习如何在实际编程中实现这些算法,从而提升对数据结构和算法的掌握程度。此外,良好的代码注释和排版也是评估实验报告质量的重要方面,有助于提高代码的可读性...

    数据结构各种排序c语言实现

    数据结构 各种排序 c语言 完整程序 完成1-20000的排序算法. 直接插入排序 冒泡排序 快速排序 直接选择排序 堆排序 希尔排序

    数据结构之排序实验报告

    【数据结构之排序实验报告】 本实验主要涵盖了四种基本的排序算法:直接插入排序、折半插入排序、起泡排序和简单选择排序。这些排序算法是数据结构领域中基础且重要的概念,对于理解和优化算法效率至关重要。 1. *...

    数据结构排序实验报告

    ### 数据结构排序实验报告知识点解析 #### 实验背景与目的 - **实验背景**:本实验报告来源于南昌大学科学技术学院信息学科部计算机系的一次专业课程实验。《数据结构》作为一门重要的计算机基础课程,其目的在于...

    数据结构 各种排序算法

    数据结构中的排序算法是计算机科学中的重要概念,用于组织和管理数据,提高数据访问和...总的来说,理解和实现这些排序算法对于提升编程技能和深入理解数据结构有重要意义,也有助于在实际项目中选择合适的排序方法。

    数据结构希尔排序

    数据结构排序一章的希尔结构排序,显示结果的

    算法ppt 数据结构、排序等

    在这个“算法ppt 数据结构、排序等”压缩包中,PPT文件很可能包含了对这些概念的详细讲解,包括其原理、实现方式以及优缺点分析。通过学习这些材料,你将能更好地理解数据结构与排序算法,提升自己的编程技能和问题...

    数据结构内部排序实验报告

    内部排序则是数据结构中的一个重要部分,它指的是在计算机内存中对数据进行排序的方法。本实验报告将深入探讨四种经典的内部排序算法:冒泡排序、基数排序、快速排序和希尔排序,以及它们在C++和C语言中的实现。 1....

Global site tag (gtag.js) - Google Analytics