C语言——排序算法

一、插入排序

1.基本思想

直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。

实际中我们玩扑克牌时,就用了插入排序的思想

2.直接插入排序

当插入第i(i>=1)个元素时,前面的array[0],array[1],...,array[i-1]已经排好序,此时用array[i]的排 序码与array[i-1],array[i-2],...的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置 上的元素顺序后移

cpp 复制代码
//插入排序(升序)
void InsertSort(int* a, int n)
{
	//[0,end]有序,让end + 1位置的值插入进去
    //使[0,end + 1]有序
	int i = 0;
    //外层for循环控制end的终止位置
    //假设开始第一个数有序
	for (i = 0;i < n - 1;i++)
	{
		int end = i;
		int tmp = a[end + 1];
		while (end >= 0)
		{
            //把比tmp大的数往后挪
			if (a[end] > tmp)
			{
				a[end + 1] = a[end];
				--end;
			}
			else
				break;
		}
        //1.比所有数都小,while循环自然结束
        //2.在中间插入,while循环被break
		a[end + 1] = tmp;
	}
}

3.时间复杂度:O(N²)

什么情况下最坏?逆序1+2+3+...+n-1

什么情况下最好?顺序有序 O(N)

二、希尔排序

直接插入排序的基础上的优化

1、先进行预排序,让数组接近有序

①预排序:分组排

间隔为gap是一组,假设gap= 3

②多组间隔为gap的预排序,gap由大变小

1)gap越大,大的数可以越快的到后面,

小的数可以越快的到前面

2)gap越大,预排完越不接近有序

gap越小,越接近有序

3)gap=1时就是直接插入排序

2、直接插入排序

cpp 复制代码
//希尔排序
void ShellSort(int* a, int n)
{
	int gap = n;
	//把间隔为gap的多组数据同时排
	//1.当gap>1时,都是预排序
	// 目标:接近有序
	//2.当gap=1,就是直接插入排序
	// 目标:有序
	while (gap > 1)
	{
		gap = gap / 2;//log2N
		//关于gap的取值,没有明确的标准
		//只要保证最后一项为1即可

        //gap很大时,下面预排序时间复杂度O(N)
        //gap很小时,数组已经很接近有序了,这时差不多也是O(N)
		int i = 0;
		for (i = 0;i < n - gap;i++)
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (a[end] > tmp)
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
					break;
			}
			a[end + gap] = tmp;
		}
	}
}

三、堆排序

1.堆的结构

①堆的逻辑结构是一颗完全二叉树

②堆的物理结构是一个数组

③通过下标父子节点关系

leftchild=parent*2+1

rightchild=parent*2+2

parent=(child-1)/2

2.堆的两个特性

结构性 :用数组表示的完全二叉树;

有序性:任一结点的关键字是其子树所有结点的最大值(或最小值)

"最大堆(MaxHeap)",也称"大顶堆":最大值

"最小堆(MinHeap)",也称"小顶堆":最小值

大堆要求:树中所有的父亲都大于等于孩子

小堆要求:树中所有的父亲都小于等于孩子

如上图为小堆

3.建堆

①例如建小堆

前提:左右子树都是小堆

向下调整算法:从根节点开始,选出左右孩子中小的那一个,跟父亲比较,如果比父亲小就交换,然后再继续往下调,然后再继续往下调,调到叶子节点就终止

相关推荐
qq_5375626710 小时前
跨语言调用C++接口
开发语言·c++·算法
wjs202410 小时前
DOM CDATA
开发语言
Tingjct10 小时前
【初阶数据结构-二叉树】
c语言·开发语言·数据结构·算法
猷咪11 小时前
C++基础
开发语言·c++
IT·小灰灰11 小时前
30行PHP,利用硅基流动API,网页客服瞬间上线
开发语言·人工智能·aigc·php
快点好好学习吧11 小时前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
秦老师Q11 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
烟锁池塘柳011 小时前
解决Google Scholar “We‘re sorry... but your computer or network may be sending automated queries.”的问题
开发语言
是誰萆微了承諾11 小时前
php 对接deepseek
android·开发语言·php
2601_9498683611 小时前
Flutter for OpenHarmony 电子合同签署App实战 - 已签合同实现
java·开发语言·flutter