12-数据结构-排序

排序算法
一.比较类排序
1.交换排序
(1).冒泡

#include <stdio.h>void PrintContext(char sort[], int size)
{for(int i=0;i<size;i++){printf("%d ", sort[i]);}printf("\n");
}//冒泡排序
//Reverse 0:正向排序
//Reverse 1:反向排序
void OrderBubbleSort(char sort[], int size, int Reverse)
{for(int i=0; i<size; i++){for(int j=0; j<size -i-1; j++){if(0 == Reverse){if(sort[j] > sort[j+1]){char tmp;tmp = sort[j+1];sort[j+1] = sort[j];sort[j] = tmp;}}else{if(sort[j] < sort[j+1]){char tmp;tmp = sort[j+1];sort[j+1] = sort[j];sort[j] = tmp;}}}}
}int main()
{char sort1[8] = {1,3,4,2,5,6,8,7};char sort2[10] = {1,3,4,2,10,9,5,6,8,7};printf("sort1:");PrintContext(sort1, sizeof(sort1));printf("sort1 Order:");OrderBubbleSort(sort1, sizeof(sort1),0);PrintContext(sort1, sizeof(sort1));printf("sort1 ReverseOrder:");OrderBubbleSort(sort1, sizeof(sort1),1);PrintContext(sort1, sizeof(sort1));printf("sort2:");PrintContext(sort2, sizeof(sort2));printf("sort2 Order:");OrderBubbleSort(sort2, sizeof(sort2),0);PrintContext(sort2, sizeof(sort2));printf("sort2 ReverseOrder:");OrderBubbleSort(sort2, sizeof(sort2),1);PrintContext(sort2, sizeof(sort2));return 0;
}

运行结果

sort1:1 3 4 2 5 6 8 7 
sort1 Order:1 2 3 4 5 6 7 8 
sort1 ReverseOrder:8 7 6 5 4 3 2 1 
sort2:1 3 4 2 10 9 5 6 8 7 
sort2 Order:1 2 3 4 5 6 7 8 9 10 
sort2 ReverseOrder:10 9 8 7 6 5 4 3 2 1 


(2).快速

#include <stdio.h>void PrintContext(char sort[], int size)
{for(int i=0;i<size;i++){printf("%d ", sort[i]);}printf("\n");
}void ExChangeNum(char sort[], char num1, char num2)
{char tmp;tmp = sort[num1];sort[num1] = sort[num2];sort[num2] = tmp;
}//快速排序
void QuickSort(char sort[], int start, int end)
{if(start > end)return ;int start_loop = start;int end_loop = end;char Base = sort[start];while(start_loop < end_loop){while(start_loop < end_loop && sort[end_loop] >= Base){end_loop=end_loop-1;}while(start_loop < end_loop && sort[start_loop] <= Base){start_loop = start_loop+1;}if(start_loop < end_loop)ExChangeNum(sort,start_loop, end_loop);}ExChangeNum(sort,start, start_loop);QuickSort(sort, start, end_loop-1);QuickSort(sort, end_loop+1, end);}int main()
{char sort1[8] = {1,3,4,2,5,6,8,7};char sort2[10] = {3,1,4,2,10,9,5,6,8,7};printf("sort1:");PrintContext(sort1, sizeof(sort1));printf("sort1 Order:");QuickSort(sort1, 0, sizeof(sort1)-1);PrintContext(sort1, sizeof(sort1));printf("sort2:");PrintContext(sort2, sizeof(sort2));printf("sort2 Order:");QuickSort(sort2, 0, sizeof(sort2)-1);PrintContext(sort2, sizeof(sort2));return 0;
}

运行结果

sort1:1 3 4 2 5 6 8 7 
sort1 Order:1 2 3 4 5 6 7 8 
sort2:3 1 4 2 10 9 5 6 8 7 
sort2 Order:1 2 3 4 5 6 7 8 9 10


2.插入排序
(1).简单插入

比较简单,不详细描述
(2).希尔

希尔排序本质上也是直接插入排序,但是会先进行预排序,使原序列更接近有序序列,最后将预排之后的序列进行直接插入排序。
序列:arr1[] = {9,8,7,6,5,4,3,2,1,0},如果用直接插入排序,那么需要往后移动元素的次数为n*(n-1)/2,也就是45次;
序列呢:arr2[] = {0,1,2,3,5,4,8,7,6,9};,用直接插入排序,需要移动元素的次数仅为4次。
希尔排序就是根据步长设置,先分区域排序,减少元素移动次数

一个数组为{9,7,8,4,6,1,3,2},有数组我们可知这个数组中的元素个数为8个
(1)第一次步长:step = n(数组元素个数) / 2(这里/号为c语言中的取整符号) => 8/2=4;
先9与6,7和1,8和3,4和2比
{6,1,3,2,9,7,8,4}
(2)第二次步长:step = step(这里的step为第一次的step的值)/2 => 4/2 = 2;
再6,3,9,8比,1,2,7,4比
{3,1,6,2,8,4,9,7}
(3)第三次步长:step = step(这个同上)/2 => 2/2 = 1;
最后所有比
{1,2,3,4,6,7,8,9}

#include <stdio.h>void arr_out(int a[8])
{int i = 0;for(i = 0;i < 8;i++){printf("%d ",a[i]);}printf("\n");
}void arr_sort(int *p,int n)
{int step = 0;//步长int temp = 0;//用来保存第二段数据int i,j;for(step = n / 2;step > 0;step /= 2){for(i = step;i < n;i++){temp = p[i];for(j = i - step;j >= 0 && p[j] > temp;j -= step){p[j + step] = p[j];//当满足条件时第一次j+step = i;后面的j+step = 上一次j的值}p[j + step] = temp;}}
}int main()
{int a[8] = {9,7,8,4,6,1,3,2};arr_sort(a,8);//排序函数arr_out(a);//输出函数return 0;
}


3.选择排序


(1).简单选择

比较简单,不详细描述


(2).堆:以下4步,完成堆排序

1).数组转化为二叉树
父节点下标为k(k>0),那么其左孩子下标为2*k,右孩子下标为2*k+1
leftchild=parent×2+1;
rightchild=parent×2+2;
parent=(child-1)/2。
2).最大堆排序 (Heapify)
从左右孩子中选择最大的孩子结点,与父结点交换,并递归调整交换后的孩子结点
3).创建最大堆(CreateHeap)
单对一个节点进行最大堆调整并不能使整个二叉树形成最大堆,所以我们需对末尾节点的父节点依次向前进行最大堆排序,从而使得二叉树形成最大堆。
4)、堆排序
根节点为最大值,将其与末尾子节点交换
对根节点进行最大堆调整,以交换的末尾节点不参与调整 ,使根节点为下一个最大值
不断变换,缩小最大堆调整范围,只剩根节点,完成节点排序

#include <stdio.h>
#define size 10void Swap(int *num, int i, int j)
{int temp;temp = num[i];num[i] = num[j];num[j] = temp;
}   // 最大堆调整
void Heapify(int *num, int len, int k)
{if (k < len){int root = k;           // 根结点int lchild = 2*k + 1;   // 左孩子结点int rchild = 2*k + 2;   // 右孩子结点// 查找左右孩子结点中的最大结点if (lchild < len && num[root] < num[lchild]){root = lchild;}   if (rchild < len && num[root] < num[rchild]){root = rchild;}   // 交换最大结点到根结点if (root != k){Swap(num, root, k);// 每次交换都可能影响到对应孩子结点子树的顺序// 所以需要对交换后的孩子结点子树进行最大堆调整Heapify(num, len, root);}   }   
}// 创建最大堆
void CreateHeap(int *num, int len)
{int i;// 最后一个结点下标int last = len - 1;// 最后一个结点的父结点下标int parent = (last - 1) / 2;// 从最后一个结点的父结点到根结点,依次进行最大堆调整for (i = parent; i >= 0; i--){Heapify(num, len, i);}   
}   // 堆排序
void HeapSort(int *num, int len)
{// 创建最大堆并进行最大堆调整CreateHeap(num, len);printf("最大堆调整!\n");int i;// 依次取出根结点(最大值)for (i = len - 1; i >= 0; i--){// 将最大堆的根结点(最大值)换到最后一个结点Swap(num, i, 0);// 交换后二叉树的根结点发生了改变,故还需对根结点做最大堆调整(已交换的末尾结点不参与调整)// 而此时根结点小于所有父结点,因而在调整时只需考虑最大孩子的分支即可Heapify(num, i, 0);}   
}   int main()
{int i, num[size] = {8, 4, 3, 1, 6, 9, 5, 7, 2, 0};HeapSort(num, size);for (i = 0; i < size; i++){printf("%d ", num[i]);}   printf("\n");return 0;
}   


4.归并排序
(1).二路归并

二路归并的步骤是先拆分,再合并,具体步骤如下
{ 5,9,8,6,1,3,2,4 }
=>{5,9,8,6} {1,3,2,4}
=>{5,9} {8,6} {1,3} {2,4}
=>{5} {9} {8} {6} {1} {3} {2} {4}
=>{5,9} {6,8} {1,3} {2,4}
=>{5,6,8,9} {1,2,3,4}
=>{1,2,3,4,5,6,8,9}

(2).多路归并

和二路归并类似,不做具体描述


二.非比较排序
1.计数排序


2.桶排序


3.基数排序

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

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

相关文章

【数据库原理】(2)数据库管理系统(DBMS)介绍

数据库管理系统&#xff08;Database Management System, DBMS&#xff09;是一种特殊的软件&#xff0c;它充当用户和电脑操作系统之间的中间层。它的主要任务是帮助用户轻松地创建、使用和维护数据库&#xff0c;同时确保数据的安全、完整性&#xff0c;以及支持多用户同时访…

elasticsearch系列九:异地容灾-CCR跨集群复制

概述 起初只在部分业务中采用es存储数据&#xff0c;在主中心搭建了个集群&#xff0c;随着es在我们系统中的地位越来越重要&#xff0c;数据也越来越多&#xff0c;针对它的安全性问题也越发重要&#xff0c;那如何对es做异地容灾呢&#xff1f; 今天咱们就一起看下官方提供的…

【电商项目实战】商品详情显示与Redis存储购物车信息

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《电商项目实战》。&#x1f3af;&#x1f3af; &am…

合伙企业有哪些分类

合伙企业分为&#xff1a;普通合伙企业和有限合伙企业。其中&#xff0c;普通合伙企业又包含特殊的普通合伙企业。 1、普通合伙企业由2人以上普通合伙人(没有上限规定)组成。 普通合伙企业中&#xff0c;合伙人对合伙企业债务承担无限连带责任。 特殊的普通合伙企业中&#xf…

软件测试/测试开发丨Python 封装 学习笔记

封装的概念 封装&#xff08;Encapsulation&#xff09; 隐藏&#xff1a;属性和实现细节&#xff0c;不允许外部直接访问暴露&#xff1a;公开方法&#xff0c;实现对内部信息的操作和访问 封装的作用 限制安全的访问和操作&#xff0c;提高数据安全性可进行数据检查&#x…

『番外篇九』SwiftUI 实战:打造一款“五脏俱全”的网络图片显示 App(上)

概览 俗话说得好:“读书破万卷,下笔如有神”。不过如果把这句话放到编程的学习上可就不那么贴切了。 要想熟练掌握一门编程语言,光看书是绝对不够的。我们还需尽可能的多撸码、早撸码,撸到无路可退、海枯石烂才有可能一窥门径。 在本篇和续篇博文中,我们将和小伙伴们一起…

7.优化前后端交互的秘诀

注释规约 【强制】类、类属性、类方法的注释必须使用 Javadoc 规范&#xff0c;使用/*内容/格式&#xff0c;不得使用 // xxx 方式。 说明&#xff1a;在 IDE 编辑窗口中&#xff0c;Javadoc 方式会提示相关注释&#xff0c;生成 Javadoc 可以正确输出相应注释&#xff1b;在 I…

c++_09_继承

1 继承 C的继承是弱继承 继承的语法&#xff1a; class 子类 : 继承方式1 基类1, 继承方式2 基类2, ... { ... }; 继承方式&#xff1a; 共有继承 public 保护继承 protected 私有继承 private 2 继承的基本属性&#xff08;3种继承方式均有&#xff09; 继承所…

Javaweb之JDBC的详细解析

2. JDBC介绍(了解) 2.1 介绍 通过Mybatis的快速入门&#xff0c;我们明白了&#xff0c;通过Mybatis可以很方便的进行数据库的访问操作。但是大家要明白&#xff0c;其实java语言操作数据库呢&#xff0c;只能通过一种方式&#xff1a;使用sun公司提供的 JDBC 规范。 Mybatis…

从 MySQL 的事务 到 锁机制 再到 MVCC

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、事务 1.1 含义 1.2 ACID 二、锁机制 2.1 锁分类 2.2 隔离级别 三、MVCC 3.1 介绍 3.2 隔离级别 3.3 原理 四、总结 前…

Impala中kudu基础理论详解(超详细)

文章目录 前言一、概述1. Impala简介2. kudu简介3. kudu架构(1) Master节点(2) Tablet服务器&#xff08;TServer&#xff09;(3) 表&#xff08;Table&#xff09;(4) 数据模型 4. kudu特性与优势(1) 快速随机访问(2) 列式存储与压缩(3) 数据一致性保证 5. kudu应用场景6. Kud…

鸟瞰uml(中)

21.依赖和关联之间的区别 依赖&#xff08;Dependency&#xff09;&#xff1a; 依赖关系是一种较弱的关系&#xff0c;它表示一个类在某些条件下使用了另一个类。一个类的变化可以影响到依赖它的类&#xff0c;但不必须反过来&#xff0c;即依赖关系是一个单向的。依赖关系通…

【2023年度总结】 何其有幸 年岁并进 一元复始 万象更新

&#x1f319; 新年将至&#xff0c;万物更新&#xff0c;旧疾当愈。 今年极度焦虑。发生太多事情&#xff0c;做出很多改变。 自律。早起、拍照、运动、读书、学习、认识了很多厉害的朋友&#xff0c;尝试影响周围的人。这是我生活正向能量的来源。 学习。今年依然是把大量…

C#上位机与欧姆龙PLC的通信06---- HostLink协议(FINS版)

1、介绍 对于上位机开发来说&#xff0c;欧姆龙PLC支持的主要的协议有Hostlink协议&#xff0c;FinsTcp/Udp协议&#xff0c;EtherNetIP协议&#xff0c;本项目使用Hostlink协议。 Hostlink协议是欧姆龙PLC与上位机链接的公开协议。上位机通过发送Hostlink命令&#xff0c;可…

golang的大杀器协程goroutine

在Golang中&#xff0c;协程&#xff08;Goroutine&#xff09;是轻量级的执行单元&#xff0c;用于实现并发编程。它是Golang语言的重要组成部分&#xff0c;提供了简洁、高效的方式来处理并发任务。 特点&#xff1a; 1&#xff09;轻量级&#xff1a;Go语言的协程是轻量级…

Golang leetcode206 翻转链表 迭代 递归 双指针

文章目录 翻转链表 leetcode206题解第一版 直接建立新的链表双指针迭代递归法 翻转链表 leetcode206 至此走到这里&#xff0c;我们对于链表的结构应当已经比较熟悉&#xff0c;下面的就是敢于操作 题解第一版 直接建立新的链表 时间复杂度太高 // 初始方法&#xff0c;建立…

简单搭建 SSM 项目实现登录

目录 项目简介项目层级介绍&#xff0c;导入依赖添加配置业务逻辑实现前端 JSP 页面实现 项目简介 SSM&#xff08;Spring、Spring MVC、MyBatis&#xff09;框架&#xff0c;是一种 Java Web 应用程序开发框架的集合&#xff0c;可以帮助开发者快速搭建 Java Web 应用程序。想…

React16源码: Suspense与lazy源码实现

Suspense 与 lazy 1 &#xff09;概述 Suspense 是在 react16.6 提供的新 feature用于加载的缓冲的内置组件 2 &#xff09;示例程序 lazy.js // lazy.js import React from react export default () > <p>Lazy Comp</p>主程序 import React, { Suspense, …

ARM AArch64的虚拟化(virtualization)详解(上)

目录 一、概述 开始之前 二、虚拟化介绍 为什么虚拟化很重要

用队列实现栈(JAVA)

仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() …