热门标签 | 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号桶从下往上收集,依次排开,收集结果最低位有序。依次对中间位和高位进行分配和收集,最后整个序列有序。


推荐阅读
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 本文由瀚高PG实验室撰写,详细介绍了如何在PostgreSQL中创建、管理和删除模式。文章涵盖了创建模式的基本命令、public模式的特性、权限设置以及通过角色对象简化操作的方法。 ... [详细]
  • 本文详细介绍了 MySQL 中 LAST_INSERT_ID() 函数的使用方法及其工作原理,包括如何获取最后一个插入记录的自增 ID、多行插入时的行为以及在不同客户端环境下的表现。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文介绍如何通过创建替代插入触发器,使对视图的插入操作能够正确更新相关的基本表。涉及的表包括:飞机(Aircraft)、员工(Employee)和认证(Certification)。 ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • openGauss每日一练:第6天 - 模式的创建、修改与删除
    本篇笔记记录了openGauss数据库中关于模式(Schema)的创建、修改和删除操作。通过这些操作,用户可以更好地管理和控制数据库对象。实验环境为openGauss 2.0.0,并使用由墨天轮提供的线上环境。 ... [详细]
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社区 版权所有