数据结构中常见的排序及其代码C语言版本

news2024/9/22 5:32:22

这里非常抱歉 没有做好动图 等我做好了动态单独做一期博客到时候大家结合动图将本篇博客联系起来看 更容易理解一些喔
常见的数据结构中的排序算法有冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序等。

冒泡排序:比较相邻的元素,如果前一个比后一个大,就交换它们的位置,一轮下来可以将最大的元素放到最后面。时间复杂度为O(n^2)。

1冒泡排序

void bubble_sort(int arr[], int len) {
    int i, j, temp;
    for (i = 0; i < len - 1; i++) {
        for (j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

2选择排序

在这里插入图片描述

选择排序:每次从未排序的元素中选择最小的元素,放到已排序的末尾。时间复杂度为O(n^2)

void selection_sort(int arr[], int len) {
    int i, j, min_index, temp;
    for (i = 0; i < len - 1; i++) {
        min_index = i;
        for (j = i + 1; j < len; j++) {
            if (arr[j] < arr[min_index]) {
                min_index = j;
            }
        }
        if (min_index != i) {
            temp = arr[i];
            arr[i] = arr[min_index];
            arr[min_index] = temp;
        }
    }
}

3插入排序

void insertion_sort(int arr[], int len) {
    int i, j, temp;
    for (i = 1; i < len; i++) {
        temp = arr[i];
        for (j = i - 1; j >= 0 && arr[j] > temp; j--) {
            arr[j + 1] = arr[j];
        }
        arr[j + 1] = temp;
    }
}

4快速排序

//三数取中
int GetMiddle(int* a, int left, int right) {
	int middle = (left + right) / 2;
	if (a[left] < a[middle]) {
		if (a[left] < a[middle]) {
			return middle;
		}
		else if (a[left] > a[right]) {
			//此时的middle是最大值
			return left;
		}
		else {
			return right;
		}
	}
	else {
		if (a[middle] > a[right]) {
			return middle;
		}
		else if (a[left] < a[right]) {
			//此时middle最小
			return left;
		}
		else {
			return right;
		}
	}
}
//快速排序之挖坑法
void PartSort2(int* a, int left, int right) {
	int midi = GetMiddle(a, left, right);
	Swap(&a[left], &a[midi]);
	int keyi = a[left];
	int hole = left;
	while (left < right && a[right] >= keyi) {
		//右边先走;将小于keyi的值填入hole中;此时右边就形成了新的坑位;
		--right;
	}
	a[hole] = a[right]; hole = right;
	while (left < right && a[left] <= keyi) {
		//左边走;找大的填入右边的坑位;左边就形成了新的坑位;
		++left;
	}
	a[hole] = a[left]; hole = left; return hole;
}
//快速排序之前后指针法

void QuickSort(int* a, int begin, int rear) {
	if (begin >= rear) {
		return;
	}
	int key = PartSort(a, begin, rear);
	//求时间复杂度:O(N*logN);
	QuickSort(a, begin, key - 1);
	QuickSort(a, key + 1, rear);
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

快速排序:采用分治法,选取一个基准元素,将数组分成两个子序列,小于基准元素的放在左边,大于基准元素的放在右边,然后对左右两个子序列递归进行快速排序。时间复杂度为O(nlogn)

void insertion_sort(int arr[], int len) {
    int i, j, temp;
    for (i = 1; i < len; i++) {
        temp = arr[i];
        for (j = i - 1; j >= 0 && arr[j] > temp; j--) {
            arr[j + 1] = arr[j];
        }
        arr[j + 1] = temp;
    }
}

5归并排序

在这里插入图片描述

归并排序:采用分治法,将数组分成若干个子序列,对每个子序列进行排序,然后再将已排序的子序列合并成一个有序的序列。时间复杂度为O(nlogn)

void merge(int arr[], int left, int mid, int right) {
    int i = left, j = mid + 1, k = 0;
    int *temp = (int *)malloc((right - left + 1) * sizeof(int));
    while (i <= mid && j <= right) {
        if (arr[i] <= arr[j]) {
            temp[k++] = arr[i++];
        } else {
            temp[k++] = arr[j++];
        }
    }
    while (i <= mid) {
        temp[k++] = arr[i++];
    }
    while (j <= right) {
        temp[k++] = arr[j++];
    }
    for (i = left, k = 0; i <= right; i++, k++) {
        arr[i] = temp[k];
    }
    free(temp);
}

void merge_sort(int arr[], int left, int right) {
    if (left >= right) {
        return;
    }
    int mid = (left + right) / 2;
    merge_sort(arr, left, mid);
    merge_sort(arr, mid + 1, right);
    merge(arr, left, mid, right);
}

6希尔排序

希尔排序:是插入排序的改进版,通过将数组分成若干个子序列进行插入排序,最后再对整个数组进行一次插入排序。时间复杂度为O(nlogn)
在这里插入图片描述

在这里插入图片描述

//2.希尔排序
void ShellSort(int* a, int n) {
	int gap = 3;
	//2(1).控制整个循环
	for (int j = 0; j < gap; ++j) {
		//2(2).控制一组循环
		for (int i = j; i < n - gap; i += gap) {
			int rear = 0;
			int tmp = a[rear + gap]; while (rear >= 0) {
				if (tmp < a[rear]) {
					a[rear + gap] = a[rear];
					rear -= gap;
				}
				else {
					break;
				}
			}
			a[rear + gap] = tmp;
		}
	}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1080387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

京东数据分析软件:京东销售数据在哪里看?

京东数据分析可以帮助企业了解京东平台上的销售数据和用户行为数据&#xff0c;以便更有效地制定营销策略和优化经营。例如&#xff0c;通过分析京东销量数据&#xff0c;店家可以了解自己店铺的销售情况&#xff0c;发现问题并及时调整。这对于店家来说具有重要的作用&#xf…

塔望食观察 | 中国海参产业发展现状及挑战

海参&#xff0c;一个古老的物种&#xff0c;堪称海底活化石&#xff0c;据资料显示&#xff0c;海参在地球上存活超过6亿年&#xff0c;比恐龙还早。海参的药用、食疗和营养滋补价值极高&#xff0c;清朝学者赵学敏编的《本草纲目拾遗》有这样的叙述&#xff1a;“海参性温补&…

SpringBoot通过配置切换注册中心(多注册中心nacos和eureka)

场景&#xff1a; 因项目需要&#xff0c;一个springcloud微服务工程需要同时部署到A,B两个项目使用&#xff0c;但A项目使用Eureka注册中心&#xff0c;B项目使用Nacos注册中心&#xff0c;现在需要通过部署时修改配置来实现多注册中心的切换。 解决思路&#xff1a; 如果同时…

算法通关村第17关【黄金】| 跳跃游戏问题

1. 跳跃游戏 思路&#xff1a;每个nums[i]i代表当前最后覆盖范围&#xff0c;这里和字符串分割那道题一样求覆盖区间&#xff0c;取cur的最大值 class Solution {public boolean canJump(int[] nums) {int len nums.length;if(len 1){return true;}int cur 0;for(int i 0;…

如何建立线上线下相结合的数字化新零售体系?

身处今数字化时代&#xff0c;建立线上线下相结合的数字化新零售体系是企业成功的关键。蚓链数字化营销系统致力于帮助企业实现数字化转型&#xff0c;打通线上线下销售渠道&#xff0c;提升品牌影响力和用户黏性&#xff0c;那么具体是如何建立的&#xff1f; 1. 搭建数字化中…

虹科分享 | 确保冻干工艺开发中精确测量和数据完整性的5步指南

虹科分享 | 确保冻干工艺开发中精确测量和数据完整性的5步指南 介绍 冻干周期的工艺开发在冻干中起着至关重要的作用&#xff0c;因为它可以优化关键工艺参数&#xff0c;以实现理想的产品质量和工艺一致性。优化冻干工艺还可以缩短运行时间&#xff0c;尽早发现关键错误&…

基于threejs的3d可视化工厂示例

源码下载地址在文章末尾&#xff01; 效果演示 总览 内部设备 选中机器展示数据 源码下载地址 https://download.csdn.net/download/qq_43185384/88415706

torch-scatter安装失败解决办法

安装torch-scatter时可以直接下载whl安装&#xff0c;但是会遇到版本不一致的问题&#xff0c;虽然可以安装但是会提示.so文件不存在或者undefined symbol: 的问题&#xff0c;可以在下面的地址中找到跟自己的torch和cuda版本对应的torch-scatter安装文件。 https://pytorch-ge…

我的AI存储实践及思考

前言 我从2020年进入人工智能行业&#xff0c;开始为AI训练提供存储解决方案及技术支持&#xff0c;随着这几年行业以及公司的发展&#xff0c;采用的存储方案经历了几次大的演变 &#xff0c;最开始使用的是分布式并行文件系统Lustre&#xff0c;接着是BeeGFSCeph&#xff0c…

leetcode(力扣) 221. 最大正方形(动态规划)

文章目录 题目描述思路分析完整代码 题目描述 在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内&#xff0c;找到只包含 ‘1’ 的最大正方形&#xff0c;并返回其面积。 输入&#xff1a;matrix [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1…

SQLAlchemy 使用封装实例

类封装 database.py #! /usr/bin/env python # -*- coding: utf-8 -*-import sys import json import logging from datetime import datetimefrom core.utils import classlock, parse_bool from core.config import (MYSQL_HOST,MYSQL_PORT,MYSQL_USER,MYSQL_PASS,MYSQL_DA…

calc方法和vue中calc不生效踩坑

calc方法 calc()方法是css用来计算的,比如一个场景,上下固定高度,中间自适应,就可以使用这个方法。 预编译less也是可以使用这个方法的 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewp…

AR动态贴纸SDK,让创作更加生动有趣

在当今的社交媒体时代&#xff0c;视频已经成为了人们表达自我、分享生活的重要方式。然而&#xff0c;如何让你的视频在众多的信息中脱颖而出&#xff0c;吸引更多的关注和点赞呢&#xff1f;答案可能就在你的手中——美摄AR动态贴纸SDK。 美摄AR动态贴纸SDK是一款专为视频编辑…

设计模式02———建造者模式 c#

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 更换天空盒&#xff08;个人喜好&#xff09; 任务&#xff1a;使用【UI】点击生成6种车零件组装不同类型车 【建造者模式】 首先资源商店下载车模型 将C…

C#实现五子棋小游戏:简单、有趣的编程项目

目录 引言什么是五子棋游戏规则开发环境准备安装C#开发环境选择合适的集成开发环境(IDE)游戏设计与功能分析游戏界面设计实现棋盘的绘制与操作实现落子功能实现输赢判断说明引言 什么是五子棋 五子棋是一种源于中国的传统棋类游戏,常见于中国、日本、韩国等亚洲国家,是亚洲…

c++视觉处理-----cv::findContours函数和图像进行去噪、平滑、边缘检测和轮廓检测,动态检测图形

cv::findContours cv::findContours 是OpenCV中用于查找图像中对象轮廓的函数。轮廓是对象的边界&#xff0c;通常用于对象检测、分割和形状分析。cv::findContours 函数的基本用法如下&#xff1a; cv::findContours(image, contours, hierarchy, mode, method, offset cv:…

单细胞分析+实验验证,多重buff加身,学会你也能发7分+。

今天给同学们分享一篇单细胞分析实验验证的生信文章“Construction of a hypoxia-immune-related prognostic panel based on integrated single-cell and bulk RNA sequencing analyses in gastric cancer”&#xff0c;这篇文章于2023年4月26日发表在Front Immunol 期刊上&am…

JUC并发编程(一):Java内存模型(JMM)及三大特性:可见性、有序性、原子性

1.简介 在当今高流量、高并发的互联网业务场景下&#xff0c;并发编程技术显得尤为重要&#xff0c;不管是哪一门编程语言&#xff0c;掌握并发编程技术是个人进阶的必经之路。时隔一个半月没有写技术博客文章&#xff0c;有点生疏了。。。闲话少叙&#xff0c;接下来我将围绕…

在使用nohup命令后台训练pytorch模型时,关闭ssh窗口导致的训练任务失败解决方法

下班前使用终端通过SSH登陆服务器&#xff0c;用nohup命令后台训练了一个pytorch模型。第二天来公司上班发现模型训练终止&#xff0c;报如下问题。 WARNING:torch.distributed.elastic.agent.server.api:Received 1 death signal, shutting down workers WARNING:torch.distr…

2023年陕西省安全员B证证考试题库及陕西省安全员B证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年陕西省安全员B证证考试题库及陕西省安全员B证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大…