数据算法--7.2.2排序算法

2023-09-18 17:40:11

一、希尔排序

基本有序

#include <stdio.h>

void InsertSort(int k[],int n)
{
	int i,j,temp;
	int gap = n;
	do
	{
	
		gap = gap/3+1;
		
		for(i=gap;i<n;i++)
		{
			if(k[i]<k[i-gap])
			{
				temp = k[i];
				for(j=i-gap;k[j]>temp;j-=gap)
				{
					k[j+gap] = k[j];
				}
				k[j+gap] = temp;
			}
		}
	}while(gap>1);
}

int main()
{
	int i,a[10]= {5,2,6,0,3,9,1,7,4,8};
	InsertSort(a,10);
	printf("排序后的结果是:\n");
	for(i=0;i<10;i++)
	{
		printf("%d\t",a[i]);
	}
	printf("\n\n");
	return 0;
}

二、堆排序

        根结点一定是堆中所有结点最大或者最小者,如果按照层序遍历的方式给结点从1开始编号,则结点之间满足如下关系:

Ki>=K2i   ,   Ki>=K2i+1    或     Ki< = K2i       Ki<= K2i+1       ( i< = i<=[n/2])

.  下标i 与 2i  和2i+1 是双亲和子女关系

.   那么把大顶堆和小顶堆用层序遍历存入数组,则一定满足上面的表达式。

堆排序(Heap Sort)就是利用堆进行排序的算法,它的基本思想是:

——将待排序的序列构造成一个大顶堆(或小顶堆)。

——此时,整个序列的最大值就是堆顶的根结点。将它移走(就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值)。

——然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次大值。

——如此反复执行,便能得到一个有序序列。

#include <stdio.h>

void swap(int k[],int i,int j)
{
	int temp;
	
	temp = k[i];
	k[i] = k[j];
	k[j] = temp;
}

void HeapAdjust(int k[],int s,int n)
{
	int i,temp;
	temp = k[s];
	for(i=2*s;i<=n;i*=2)
	{
		if(i < n && k[i] < k[i+1])
		{
			i++;
		}
		if(temp >= k[i])
		{
			break;
		}
		k[s] = k[i];
		s = i;
	 } 
	k[s] = temp;
}

void HeapSort(int k[], int n)
{
	int i;
	for(i = n/2;i>0;i--)
	{
		HeapAdjust(k,i,n);
	}
	for(i= n;i>1;i--)
	{
		swap(k,1,i);
		HeapAdjust(k,1,i-1);
	}
}

int main()
{
	int i,a[10]= {5,2,6,0,3,9,1,7,4,8};
HeapSort(a,10);
	printf("排序后的结果是:\n");
	for(i=0;i<10;i++)
	{
		printf("%d\t",a[i]);
	}
	printf("\n\n");
	return 0;
}

 三、归并排序

归并排序(Merge Sort)就是利用归并的思想实现的排序方法。它的原理是假设初始序列有n个记录,则可以看成是n个记录,则可以看成n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列;依次往复。

#include <stdio.h>
#define MAXSIZE 10
void merging(int *list1,int list1_size, int *list2,int list2_size)
{
	int j,k,i;
	int temp[MAXSIZE];
	i = j = k = 0;
	while( i< list1_size && j < list2_size)
	{
		if(list1[i]<list2[j])
		{
			temp[k++] = list1[i++];
		}
		else
		{
			temp[k++] = list2[j++];
		}
	}
	while(i < list1_size)
	{
		temp[k++] = list1[i++];
	}
	while(j < list2_size)
	{
		temp[k++] = list2[j++];
	}
	for(int m =0;m < (list1_size + list2_size);m++)
	{
		list1[m] = temp[m];
	}
}

void MergeSort(int k[],int n)
{
	if(n>1)
	{
		int *list1 = k;
		int list1_size  = n/2;
		int *list2 = k + n/2;
		int list2_size = n - list1_size;
		
		MergeSort(list1,list1_size);
		MergeSort(list2,list2_size);
		
		merging(list1,list1_size,list2,list2_size);
	} 
 } 
 
int main()
{
	int i,a[10]={5,2,6,0,3,9,1,7,4,8};
	MergeSort(a,10);
	printf("排序后的结果:\n");
	for(i=0;i<10;i++)
	{
		printf("%d\t",a[i]);
	}
	printf("\n\n");
	return 0;
}

三、快速排序

#include <stdio.h>

void swap(int k[],int low,int high)
{
	int temp;
	temp = k[low];
	k[low] = k[high];
	k[high] = temp;
}

int Partition(int k[],int low,int high)
{
	int point;
	point = k[low];
	while(low < high)
	{
		while(low < high && k[high] >= point)
		{
			high--;
		}
		while(low < high && k[low] <= point)
		{
			low++;
		}
	}
}

void Qsort(int k[],int low,int high)
{
	int point;
	if(low < high)
	{
		point = Partition(k,low,high);
		Qsort(k,low,point - 1);
		Qsort(k,point+1,high);
	}
}

void QuickSort(int k[],int n)
{
	Qsort(k,0,n-1);
}

int main()
{
	int i,a[10] = {5,2,6,8,3,9,1,7,4,8};\
	QuickSort(a,10);
	
	printf("排序后的结果:");
	for(i=0;i<10;i++)
	{
		printf("%d",a[i]);
	}
	printf("\n\n");
	
	return 0;
	
}

更多推荐

【操作系统笔记】进程间通信

Linux文件系统inode节点(indexnode):给每个文件赋予一个称为i节点的数据结构。inode一开始是存储在硬盘中的,只有当文件被打开的时候,其对应的i节点才加载到内存中。总结:Linux中,用户态通过读写文件的Api进行系统调用,在内核态中,上层是虚拟文件操作系统VFS,它为用户态提供统一接口,屏蔽底层实

Git 介绍、分布式版本管理软件介绍

文章目录一.分布式文件版本管理系统二、Git介绍2.1.Git的最基本使用2.2.工作中使用版本管理工具的经验2.3.Git的存储方式简介一.分布式文件版本管理系统在分布式文件版本管理系统到来之前,市面上的文件版本管理软件都是集中式的(svn就是典型的集中式文件版本管理系统),其软件会分为客户端软件和服务端软件两个部分

MySQL的备份与恢复

备份与恢复一、备份1.1数据备份的必要性1.2数据备份分类1.2.1物理备份1.2.2逻辑备份1.3数据库备份策略1.4常用的备份方法和工具1.5数据库上云迁移二、MySQL完全备份2.1简介2.2物理冷备份与恢复2.2.1物理冷备份2.2.2解压恢复2.3mysqldump备份与恢复1)完全备份一个或多个完整的库(包

web网站学习 apache (一)

文章目录学习内容apache概述apache模式配置文件详解配置实战基于域名的虚拟主机总结题学习内容web网站学习apachenginxtomcatapache概述ApacheHTTPServer(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全

JMeter压测工具介绍、安装及汉化教程,详解安装目录结构

🧑‍💻作者名称:DaenCode🎤作者简介:CSDN实力新星,后端开发两年经验,曾担任甲方技术代表,业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开发。技术尚浅,闭关学习中······😎人生感悟:尝尽人生百味,方知世间冷暖。📖所属专栏:JMeter实战专栏推荐专门为Re

【C++】特殊类设计

文章目录1.设计一个类,不能被拷贝1.C++98的实现方式2.C++11的实现方式2.设计一个类,只能在堆上创建对象3.设计一个类,只能在栈上创建对象4.设计一个类不能被继承4.1C++98的方式4.2C++11之后的方式5.设计一个类,只能创建一个对象(单例模式)重点5.1设计模式5.2单例模式5.2.1饿汉模式5.

互联网医院|互联网医院系统引领医疗科技新风潮

互联网的迅速发展已经改变了人们的生活方式,而医疗领域也不例外。近年来,互联网医院应运而生,为患者和医生提供了更便捷、高效的医疗服务。本文将深入探讨互联网医院的系统特点、功能以及未来的发展方向,为您展现医疗行业的新时代。互联网医院的系统特点使其与传统医疗方式截然不同。首先,互联网医院做到了线上线下无缝对接,通过互联网技术

buuctf web [极客大挑战 2019]Http

进入题目上下翻找了一下,没有什么突破口检查了一下源码,有一个跳转页面点击页面,跳转到了新的地方新页面里没有别的跳转接口但是页面中有提示:Itdoesn'tcomefrom'https://Sycsecret.buuoj.cn'打开burp页面提示要求来自https://Sycsecret.buuoj.cn所以,我们添加

万字长文详解Webpack5高级优化

本文从4个角度对webpack和代码进行了优化:1.提升开发体验使用SourceMap让开发或上线时代码报错能有更加准确的错误提示。2.提升打包构建速度使用HotModuleReplacement让开发时只重新编译打包更新变化了的代码,不变的代码使用缓存,从而使更新速度更快。使用OneOf让资源文件一旦被某个loade

Neutron — API Service Web 开发框架

目录文章目录目录WSGIWSGI的工作原理environ参数start_resposne参数WSGI的中间件WSGIWeb开发框架OpenStack中的应用案例进程入口WSGIApplication加载Paste/PasteDeployRoutesWebObWSGIServer启动WSGIWSGI(WebServerG

【软考中级】网络工程师:7.下一代互联网

IPv4问题与改进IPv4存在以下著名的问题:网络地址短缺(32位)以二进制数串表示,v4仅有43亿个地址,而IPv6有128位,且以十六进制数串表示。(现在还能用v4得益于NAT地址转换)地址分配不合理:IPv4中有1/3被美国占用了,其大型企业地址数比很多国家都多。路由速度慢:路由表日趋庞大,路由查找速度越来越慢。

热文推荐