常见八大排序(附动图及W字详解)(C语言)《数据结构与算法》

目录ba 

1. 排序的概念及其运用 🚀

1.1 排序的概念 🚀

1.2 排序运用 🚀

1.3 常见的排序算法 🚀

2. 常见排序算法的实现 🚀

2.1 插入排序 🚀

2.1.1 基本思想 🚀

2.1.2 直接插入排序 🚀

2.1.3 希尔排序( 缩小增量排序 ) 🚀

希尔排序的特性总结🚀

插入和希尔排序的实现 🚀

2.2 选择排序 🚀

2.2.1 基本思想 🚀

2.2.2 直接选择排序 🚀

注意特殊情况:

直接选择排序的特性总结 🚀

2.2.3 堆排序(点我看前面堆详解博客) 🚀

直接选择排序的特性总结 🚀

直接选择和堆排序的实现 🚀

2.3 交换排序 🚀

2.3.1基本思想 🚀

2.3.2冒泡排序(属于老朋友了是哈哈) 🚀

冒泡排序的特性总结 🚀

2.3.3 快速排序(也算是老朋友了,qsort大家应该用挺多的哈) 🚀

1. hoare版本 🚀

2. 挖坑法 🚀

3. 前后指针版本 🚀

4.非递归法 🚀

2.3.3 快速排序优化 🚀

快速排序的特性总结 🚀

2.4 归并排序 🚀

2.4.1 基本思想 🚀

2.4.2 递归实现 🚀

 2.4.3 非递归实现 🚀

归并排序的特性总结 🚀

3.补充非比较排序——计数排序 🚀

4.排序算法复杂度及稳定性分析 🚀

5.源代码 🚀

Sort.h 🚀

Stack.h 🚀

Stack.c 🚀

Sort.c 🚀

test.c 🚀

补充内容🚀


C语言入门篇进阶篇深剖篇都整理在这里了哈。然后这里个人主页,比点头像更好找文章哈。


作者和朋友建立的社区:非科班转码社区-CSDN社区云💖💛💙

期待hxd的支持哈🎉 🎉 🎉


最后是打鸡血环节:改变的确很难,但结果值得冒险,拿出点勇气来。路还很长,现在才刚开始而已。过去无可挽回,未来可以改变。🚀 🚀 🚀 

1.首先说明,代码里面有实现思想及非常详细的解释和实现时容易遇到的误区,有理解思想或者不想看长篇大论的伙伴们可以直接尝试看代码哈。

强烈建议进收藏夹吃灰哈!

(作者后面应该还会继续补充,把平常常见的都加进来哈,比如桶排序,计数排序,基数排序等哈,因为作者作者的博客本身就是复习为主,所以家人们放心博客质量哈)

2.源代码中有测试各排序性能的代码及测试各排序的代码(test.c)

PS:本篇作图为作者好朋友可欣提供💖💛💙

1. 排序的概念及其运用 🚀

1.1 排序的概念 🚀

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

1.2 排序运用 🚀

给你一串数据,我们可以按照一些条件将数据按照递增或者递减的方式进行排列,比如计算机里面的文件:

排序在生活中还是很有用的,比如我们可以通过首字母很快找到通讯录的联系人,找到最大值和最小值,精确找到某一天的消息…
总之,有用,好好学。

我们今天讲的所有排序都属于内部排序。 

1.3 常见的排序算法 🚀

在这里我们可以知道,希尔排序是插入排序的优化,堆排序是选择排序的优化,快数排序是交换排序的优化。 

2. 常见排序算法的实现 🚀

Sort.h

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
#include"Stack.h"


void Print(int* arr, int sz);
//2
void InsertSort(int* arr, int sz);
//3
void ShellSort(int* arr, int sz);
//1
void BubbleSort(int* arr, int sz);
//4
void SelectSort(int* arr, int sz);
//6
void HeapSort(int* arr, int sz);
//5
void QuickSort(int* arr, int begin, int end);

void QuickSortNonR(int* arr, int begin, int end);
//7
void MergeSort(int* arr, int begin, int end);

void MergeSortNonR(int* arr, int n);

Sort.c 

//后面用的多,直接写成函数方便一点
void Swap(int* p, int* q)
{
	int tmp = *p;
	*p = *q;
	*q = tmp;
}

void Print(int* arr, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

1W数据测试各排序时间 

1000W数据测试各排序时间(去掉冒泡,插入,选择)

2.1 插入排序 🚀

2.1.1 基本思想 🚀

直接插入排序是一种简单的插入排序法,其基本思想是:
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个新的有序序列
从右往左,找到 刚好比这本书高的书,放在它右边就行了。

2.1.2 直接插入排序 🚀

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

直接插入排序的特性总结:
1. 元素集合越接近有序,直接插入排序算法的时间效率越高
2. 时间复杂度: O(N^2)
3. 空间复杂度: O(1) ,它是一种稳定的排序算法
4. 稳定性:稳定

2.1.3 希尔排序( 缩小增量排序 ) 🚀

希尔排序法又称缩小增量法。希尔排序法的基本思想是: 先选定一个整数,把待排序文件中所有记录分成个 组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工 作。当到达 =1 时,所有记录在统一组内排好序

希尔排序的特性总结🚀

1. 希尔排序是对直接插入排序的优化。
2. gap > 1 时都是预排序,目的是让数组更接近于有序。当 gap == 1 时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
3. 希尔排序的时间复杂度不好计算,因为 gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定:
《数据结构 (C 语言版 ) --- 严蔚敏

《数据结构-

评论 181
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原来45

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值