【数据结构】排序——插入排序,选择排序

前言

本篇博客我们正式开启数据结构中的排序,说到排序,我们能联想到我之前在C语言博客中的冒泡排序,它是排序中的一种,但实现效率太慢,这篇博客我们介绍两种新排序,并好好深入理解排序

💓 个人主页:小张同学zkf

⏩ 文章专栏:数据结构

若有问题 评论区见📝

🎉欢迎大家点赞👍收藏⭐文章

目录

1.排序

1.1排序的概念

1.2排序的常见算法

2.插入排序

3.选择排序


1.排序

1.1排序的概念

排序 :所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
稳定性 :假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj ,且 ri 在 rj 之前,而在排序后的序列中, ri 仍在 rj 之前,则称这种排序算法是稳定的;否则称为不稳定的。
内部排序 :数据元素全部放在内存中的排序。
外部排序 :数据元素太多不能同时放在内存中,根据排序过程的要求不断地在内外存之间移动数据的排序。


1.2排序的常见算法


2.插入排序

即冒泡排序外,我们来认识一下一个新的排序
直接插入排序是一种简单的插入排序法,其基本思想是:
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个新的有序序列
实际中我们玩扑克牌时,就用了插入排序的思想

我们来看一下动图

如何用代码实现出来这个插入排序那

我们观察动图其实可以看到假如一趟0~end数是有序的,那么end+1的数得挨个与0~end数比较,比较若比end+1的数大,向右移一位,继续与下一位比较,若比end+1的数小,就插在这个数的前面,进行下一趟重复此过程

代码如下

复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void charupaixu(int* a, int x)
{
	for (int i = 0; i < x - 1; i++)
	{
		int end =i;
		int tmp = a[end + 1];
		while (end >= 0)
		{
			if (a[end] > tmp)
			{
				a[end+1] = a[end];
				end--;
			}
			else{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}
int main()
{
	int arr[] = { 2,4,89,23,987,123,5678,13,76,67,6666};
	charupaixu(arr, sizeof(arr) / sizeof(arr[0]));
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

这个排序的时间复杂度O(N)为N^2,但相比冒泡效率还是快的


3.选择排序

选择排序其实思路特别简单,通过最前面与最后面的指针进行遍历找到最大的与最小的,将最小的与开头的数交换,最大的与最后面的数交换,再两边指针减减,重复此过程

复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void swap(int* as, int* aq)
{
	int tmp = *as;
	*as = *aq;
	*aq = tmp;
}
void xuanzepaixu(int* a, int n)
{
	int begin = 0;
	int end = n-1;
	while (begin < end)
	{
		int max = begin;
		int min = begin;
		for (int i = begin+1; i <= end; i++)
		{
			if (a[min] > a[i])
			{
				 min = i;
			}
			if (a[max] < a[i])
			{
				 max = i;
			}
		}
		swap(&a[min], &a[begin]);
		if (begin == max)
		{
			max = min;
		}
		swap(&a[max], &a[end]);
		begin++;
		end--;
	}
}
int main()
{
	int arr[] = { 34,56,56,87,7644,79,382,4657,272687,246581,6341,346345,5,267,7,22,2724,57 };
	xuanzepaixu(arr, sizeof(arr) / sizeof(arr[0]));
	for (int i = 0; i < sizeof(arr) / sizeof(0); i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

但要注意,将最小数与开头数交换,此刻有可能最大数就是开头数,如果是这种情况,我们要刷新一遍最大值,然后再将最大值与结尾互换。

选择排序的时间复杂度也是O(N^2)但是比效率比冒泡还要低,综上三个排序,插入排序目前最优


结束语

这篇博客先介绍三个排序,与之前的冒泡排序已经有四个,但这些还都是太慢,其中之一的插入排序一定要好好掌握,下片博客的希尔排序要用到插入排序的思维

OK,本篇博客结束!!!

相关推荐
冻柠檬飞冰走茶20 分钟前
PTA基础编程题目集 7-19 支票面额(C语言实现)
c语言·开发语言·数据结构·算法
你怎么知道我是队长35 分钟前
计算机虚拟存储管理与页面置换算法详解
服务器·网络·算法
罗西的思考1 小时前
【Agentic RL / 强化学习 / OPD】OpenClaw-RL 源码阅读笔记 — (14)— Teacher
人工智能·笔记·深度学习·算法·机器学习
塔能物联运维1 小时前
塔能两相液冷:600W/cm²极限能力,为下一代AI芯片预留充足散热余量
人工智能·算法·两相液冷
醉城夜风~1 小时前
手撕 C++ string:从零实现一个简易字符串类
开发语言·c++·算法
手写码匠1 小时前
华为云Flexus+DeepSeek征文|DeepSeek+RAG知识库实战:基于Flexus X实例与Dify构建企业级智能问答系统
人工智能·深度学习·算法·aigc
青山木2 小时前
Hot 100 --- 组合总和
java·数据结构·算法·leetcode
zander2582 小时前
LeetCode 46. 全排列
算法·leetcode·深度优先
星恒随风3 小时前
C++ STL 详解:set 与 multiset 的使用、区间查询和算法应用
开发语言·c++·笔记·学习·算法
Lumos1863 小时前
《ESP32 物联网全栈实战-02》ESP-IDF 工程结构
算法