头歌数据结构-排序的实现及其应用

一、直接插入排序

cpp 复制代码
/*************************************************************
    直接插入排序  实现文件  
    更新于2020年6月22日
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sort.h"
	
void InsertSort(SeqList  &L) /*直接插入排序*/
{	
	int i,j;
	for(i=2;i<=L.length;i++){
	// 请在这里补充代码,完成本关任务
    /********** Begin *********/
		KeyType key = L.r[i].key;
        j=i-1;
        while(j>=1 && L.r[j].key >  key){
            L.r[j+1].key=L.r[j].key;
            j--;
        }
        L.r[j+1].key = key;
    /********** End **********/		
    }
}
void SeqListInput(SeqList &L) /*输入若干记录的关键字,存放到顺序表L中*/
{
	int i=1; KeyType x;
	scanf("%d",&x);
	while(x!=-1)
	{
		L.r[i++].key=x; scanf("%d",&x);
	}
	L.length=i-1;
}
void SeqListOutput(SeqList L) /*输出顺序表L中各记录的关键字*/
{
	int i;
	for(i=1;i<=L.length;i++)
		printf("%d ",L.r[i].key);
	printf("\n");
}

二、希尔排序

cpp 复制代码
/*************************************************************
    希尔排序  实现文件    
    更新于2020年6月22日
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sort.h"
	
void ShellInsert(SeqList &L, int d) /*对顺序表L作一趟增量为d的希尔插入排序*/
{
	// 请在这里补充代码,完成本关任务
    /********** Begin *********/
	int i,j;
    for(i=d+1;i<=L.length;i++){
        if(L.r[i].key<L.r[i-d].key){
            L.r[0]=L.r[i];
            for(j=i-d;j>0 &&L.r[0].key<L.r[j].key;j-=d){
                L.r[j+d]=L.r[j];
            }
            L.r[j+d]=L.r[0];
        }
    }
	/********** End **********/	
}
void ShellSort(SeqList &L) /*希尔排序*/
{
	int d;
	d=L.length/2;
	while(d!=0)  /*调用一趟增量为d的希尔插入排序*/
	{
		ShellInsert(L,d); d=d/2;
	}
}
void SeqListInput(SeqList &L) /*输入若干记录的关键字,存放到顺序表L中*/
{
	int i=1; KeyType x;
	scanf("%d",&x);
	while(x!=-1)
	{
		L.r[i++].key=x; scanf("%d",&x);
	}
	L.length=i-1;
}
void SeqListOutput(SeqList L) /*输出顺序表L中各记录的关键字*/
{
	int i;
	for(i=1;i<=L.length;i++)
		printf("%d ",L.r[i].key);
	printf("\n");
}

三、快速排序

cpp 复制代码
/*************************************************************
    快速排序  实现文件    
    更新于2020年6月22日
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sort.h"
int Partition(SeqList &L, int low, int high)
{
    KeyType pivotkey = L.r[low].key;
    L.r[0] = L.r[low];
    while (low < high)
    {
        while (low < high && L.r[high].key >= pivotkey)
            high--;
        L.r[low] = L.r[high];
        while (low < high && L.r[low].key <= pivotkey)
            low++;
        L.r[high] = L.r[low];
    }
    L.r[low] = L.r[0];
    return low;
}	
void QuickSort(SeqList &L, int low, int high) /*对顺序表L的子序列L.r[low...high]作快速排序*/
{
	// 请在这里补充代码,完成本关任务
    /********** Begin *********/
    int i;
    if (low < high)
    {
        i = Partition(L, low, high);
    
	/********** End **********/
	/*分别对左、右两部分进行递归排序*/
	QuickSort(L,low,i-1);/*对左半区L.r[low..i-1]进行快速排序*/
	QuickSort(L,i+1,high);/*对右半区L.r[i+1..high]进行快速排序*/
    }	
}
void SeqListInput(SeqList &L) /*输入若干记录的关键字,存放到顺序表L中*/
{
	int i=1; KeyType x;
	scanf("%d",&x);
	while(x!=-1)
	{
		L.r[i++].key=x; scanf("%d",&x);
	}
	L.length=i-1;
}
void SeqListOutput(SeqList L) /*输出顺序表L中各记录的关键字*/
{
	int i;
	for(i=1;i<=L.length;i++)
		printf("%d ",L.r[i].key);
	printf("\n");
}

四、堆排序

cpp 复制代码
/*************************************************************
    堆排序  实现文件    
    更新于2020年6月22日
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sort.h"
	
void HeapAdjust(SeqList &L, int low, int high)
{/*已知L.r[low..high]中记录的关键字除L.r[low].key之外均满足堆的定义,*/
 /*调整L.r[low].key,使L.r[low..high]成为一个新大顶堆。*/
	// 请在这里补充代码,完成本关任务
    /********** Begin *********/
	  int i = low, j = 2 * i; 
    KeyType temp = L.r[i].key; 

    while (j <= high) {
        if (j < high && L.r[j].key < L.r[j + 1].key) {
            j++; 
        }
        if (temp >= L.r[j].key) {
            break; 
        }
        L.r[i].key = L.r[j].key;
        i = j;
        j = 2 * i;
    }
    L.r[i].key = temp;
	/********** End **********/
}
void HeapSort(SeqList &L) /*堆排序*/
{
	int i;
	for(i=L.length/2;i>0;i--)/*从最后一个分支结点(编号为L.length/2)开始调整,建立初始堆*/
		HeapAdjust(L,i,L.length);
	for(i=L.length;i>1;i--)
	{
		L.r[0]=L.r[1];L.r[1]=L.r[i];L.r[i]=L.r[0];/*将堆顶L.r[1]和当前最后一个记录L.r[i]交换*/
		HeapAdjust(L,1,i-1);/*将剩余记录L.r[1..i-1]重新调整为堆*/
	}
}
void SeqListInput(SeqList &L) /*输入若干记录的关键字,存放到顺序表L中*/
{
	int i=1; KeyType x;
	scanf("%d",&x);
	while(x!=-1)
	{
		L.r[i++].key=x; scanf("%d",&x);
	}
	L.length=i-1;
}
void SeqListOutput(SeqList L) /*输出顺序表L中各记录的关键字*/
{
	int i;
	for(i=1;i<=L.length;i++)
		printf("%d ",L.r[i].key);
	printf("\n");
}
相关推荐
虾饺爱下棋7 分钟前
FCN语义分割算法原理与实战
人工智能·python·神经网络·算法
云手机掌柜1 小时前
从0到500账号管理:亚矩阵云手机多开组队与虚拟定位实战指南
数据结构·线性代数·网络安全·容器·智能手机·矩阵·云计算
Eloudy4 小时前
简明量子态密度矩阵理论知识点总结
算法·量子力学
点云SLAM4 小时前
Eigen 中矩阵的拼接(Concatenation)与 分块(Block Access)操作使用详解和示例演示
人工智能·线性代数·算法·矩阵·eigen数学工具库·矩阵分块操作·矩阵拼接操作
没书读了4 小时前
考研复习-数据结构-第八章-排序
数据结构
算法_小学生5 小时前
支持向量机(SVM)完整解析:原理 + 推导 + 核方法 + 实战
算法·机器学习·支持向量机
waveee1235 小时前
学习嵌入式的第三十四天-数据结构-(2025.7.29)数据库
数据结构·数据库·学习
iamlujingtao6 小时前
js多边形算法:获取多边形中心点,且必定在多边形内部
javascript·算法
算法_小学生6 小时前
逻辑回归(Logistic Regression)详解:从原理到实战一站式掌握
算法·机器学习·逻辑回归
DebugKitty6 小时前
C语言14-指针4-二维数组传参、指针数组传参、viod*指针
c语言·开发语言·算法·指针传参·void指针·数组指针传参