热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:考研数据结构——内部排序

本文由编程笔记#小编为大家整理,主要介绍了考研数据结构——内部排序相关的知识,希望对你有一定的参考价值。考研数据结构——排序
本文由编程笔记#小编为大家整理,主要介绍了考研数据结构——内部排序相关的知识,希望对你有一定的参考价值。

考研数据结构——排序


直冒简希,快堆并基


直接插入排序

算法思路:将待排序的关键字与已经排好的部分有序序列的中关键字从后往前进行比较,插入到合适位置,直至所有关键字都被插入到有序序列中

void insertSort(int R[],int n)//数组元素个数
{
int i,j;
int temp;
for(i=1;i {
temp=R[i];
j=i-1;
while(j>0&&temp {
R[j+1]=R[j];
--j;
}
R[j+1]=temp;
}
}

冒泡排序

算法思路:每一趟排序从第一个关键字开始,与其后一个进行比较,如果前一个大于后一个则交换,否则不交换,这样第一趟就可以把序列中最大的关键字交换到最后,第二趟可以把第二大的关键字交换到倒数第二个位置上......排序结束的条件是在一趟排序过程中没有发生关键字交换

void bubbleSort(int R[],int n)
{
int i,j,flag,temp;
for(i=n-1;i>=1;--i)
{
flag=0;
for(j=i;j<=i;j++)
{
if(R[j-1]>R[j])
{
temp=R[j];
R[j]=R[j-1];
R[j-1]=temp;
flag=1;//发生了关键字交换
}
}
if(flag==0)
return;
}
}

简单选择排序

算法思路:从无序序列中每趟挑出一个最小的关键字,与第i个关键字交换。

void selectSort(int R[],int n)
{
int i,j,k,temp;
for(i=0;i {
k=i;
//从无序序列中挑出最小的一个关键字
for(j=k+1;j if(R[k]>R[j])
k=j;
//将上面挑出的最小关键字与i位置上的关键字交换
temp=R[i];
R[i]=R[k];
R[k]=temp;
}
}

希尔排序

算法思路:将序列按照规则划分为几个子序列,分别对这几个子序列进行直接插入排序。缩小增量,最后一个增量一定是1。如有10个关键字,第一个增量为5,则0-5,1-6,2-7,3-8,4-9;第二个增量为3,则0-3-6-9,1-4-7,2-5-8;第三个增量为1,直接插入排序。

//考研数据结构需重点掌握其执行流程
void shellSort(int R[],int n)
{
int temp;
for(int gap=n/2;gap>0;gap/=2)
{
for(int i=gap;i {
temp=R[i];
int j;
for(j=1;j>=gap&&R[j-gap]>temp;j-=gap)
R[j]=R[j-gap];
R[j]=temp;
}
}
}

快速排序

算法思路:每一趟选择序列的第一个关键字作为枢轴,将序列中比枢轴小的放到枢轴前面,比枢轴大的放到枢轴后面。

void quickSort(int R[],int low,int high)
{
int temp;
int i=low,j=high;//指向头尾关键字
if(low {
temp=R[low];//第一个数作为枢轴
while(i {
//从后往前扫描,遇到比枢轴小的关键字,停到这里
while(j>i&&R[j]>=temp)
--j;
//将j位置上这个比枢轴小的值放到前面i位置上
if(i {
R[i]=R[j];
++i;
}
//从前往后扫描,遇到比枢轴大的关键字,停到这里
while(i ++i;
//将i位置上这个比枢轴大的值放到后面j位置上
if(i {
R[j]=R[i];
--j;
}
}
//i和j相遇后,把枢轴放入这个i等于j的位置
R[i]=temp;
//分别对枢轴左边和右边的序列进行递归划分
quickSort(R,low,i-1);
quickSort(R,i+1,high);
}
}

堆排序

算法思路:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列。

void sift(int R[],int low,int high)//节点调整
{
int i=low,j=2*i;
int temp=R[i];
while(j<=high)
{
if(j ++j;
if(temp {
R[i]=R[j];
i=j;
j=2*i;
}
else
break;
}
R[i]=temp;
}
void heapSort(int R[],int n)
{
int i,temp;
for(i=n/2;i>=1;--i)
sift(R,i,n);
for(i=n;i>=2;--i)
{
//换出根节点的关键字,将其放入最终位置
temp=R[1];
R[1]=R[i];
R[i]=temp;
sift(R,1,i-1);
}
}

归并排序

算法思路:先将序列分为两半,对两个序列进行归并排序,得到两个有序序列,然后将这两个有序序列合并成为一个有序序列。

void merge(int arr[],int low,int mid,int high)
{
int i,j,k;
int n1=mid-low+1;
int n2=high-mid;
int L[n1],R[n2];
for(i=0;i L[i]=arr[low+i];
for(j=0;j R[j]=arr[mid+1+j];
i=0;
j=0;
k=low;
while(i {
if(L[i]<=R[j])
arr[k]=L[i++];
else
arr[k]=R[j++];
k++;
}
while(i arr[k++]=L[i++];
while(j arr[k++]=R[j++];
}
void mergeSort(int R[],int low,int high)
{
if(low {
int mid=(low+high)/2;
mergeSort(R,low,mid);
mergeSort(R,mid+1,high);
merge(R,low,mid,high);//把R数组中low到mid和mid+1到high范围内的两段有序序列归并成一段有序序列
}
}

基数排序

算法思路:不用比较,有最低位优先和最高位优先两种。以最低位优先为例,第一趟按最低位放入对应的桶中,收集时从0号桶从下往上收集,依次排开,收集结果最低位有序。依次对中间位和高位进行分配和收集,最后整个序列有序。


推荐阅读
  • 开发笔记:9.八大排序
    开发笔记:9.八大排序 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 本文总结了优化代码可读性的核心原则与技巧,通过合理的变量命名、函数和对象的结构化组织,以及遵循一致性等方法,帮助开发者编写更易读、维护性更高的代码。 ... [详细]
  • 1.执行sqlsever存储过程,消息:SQLServer阻止了对组件“AdHocDistributedQueries”的STATEMENT“OpenRowsetOpenDatas ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • 本文探讨了如何使用自增和自减运算符遍历二维数组中的元素。通过实例详细解释了指针与二维数组结合使用的正确方法,并解答了常见的错误用法。 ... [详细]
  • 给定行数 numRows,生成帕斯卡三角形的前 numRows 行。例如,当 numRows 为 5 时,返回的结果应为:[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]]。 ... [详细]
  • 本教程详细介绍了如何使用 TensorFlow 2.0 构建和训练多层感知机(MLP)网络,涵盖回归和分类任务。通过具体示例和代码实现,帮助初学者快速掌握 TensorFlow 的核心概念和操作。 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • 本文介绍 SQL Server 的基本概念和操作,涵盖系统数据库、常用数据类型、表的创建及增删改查等基础操作。通过实例帮助读者快速上手 SQL Server 数据库管理。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • Oracle中NULL、空字符串和空格的处理与区别
    本文探讨了在Oracle数据库中使用NULL、空字符串('')和空格('_')时可能遇到的问题及解决方案。重点解释了它们之间的区别,以及在查询和函数中的行为。 ... [详细]
  • 本文详细介绍了Hive中用于日期和字符串相互转换的多种函数,包括从时间戳到日期格式的转换、日期到时间戳的转换,以及如何处理不同格式的日期字符串。通过这些函数,用户可以轻松实现日期和字符串之间的灵活转换,满足数据处理中的各种需求。 ... [详细]
author-avatar
zhousulian
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有