10种排序算法总结-(c语言实现与动画演示)

算法分类

十种常见排序算法可以分为两大类

比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。
非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。

稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。

不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。

1.冒泡排序:

#include<stdio.h>
#include<malloc.h>
void BubbleSort(int *arr,int size)
{int i = 0;int j = 0;for(i=0;i<size-1;i++){for(j=0;j<size-i-1;j++){if(arr[j]>arr[j+1]){int tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;}}}
}
int main()
{int a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};int  len=sizeof(a)/sizeof(a[0]);BubbleSort(a,len);for(int i=0;i<len;i++)printf("%d--",a[i]);}

2.选择排序

#include<stdio.h> 
void swap(int* a,int* b)//交换函数 
{int tem=*a;*a=*b;*b=tem;
}void selectionSort(int *arr, int n) //选择排序函数 
{for (int i = 0; i < n - 1; i++) {int minIndex = i;for (int j = i + 1; j < n; j++){if (arr[j] < arr[minIndex]) {minIndex = j;}}swap(&arr[minIndex],&arr[i]);}
}int main()
{int arr[] = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};int n = sizeof(arr) / sizeof(arr[0]);selectionSort(arr, n);for(int i=0;i<n;i++)printf("%d--",arr[i]);
}

3.插入排序

#include<stdio.h>
#include<stdlib.h>
void swap(int* a,int* b)
{int tem=*a;*a=*b;*b=tem;
}
void InsertSort(int *arr,int n)
{for(int i=1;i<n;i++){if(arr[i]<arr[i-1]){swap(&arr[i],&arr[i-1]);for(int j=i-1;j>0&&arr[j]<arr[j-1];j--){swap(&arr[j],&arr[j-1]);}}}
}
int main()
{int arr[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};int n = sizeof(arr) / sizeof(arr[0]);InsertSort(arr,n);for(int i=0;i<n;++i){printf("%d--",arr[i]);}} 

4.希尔排序

#include<stdio.h>
//希尔排序
void ShellSort(int *arr,int n){int d,i,j,temp;for(d=n/2;d>=1;d=d/2){for(i=d;i<n;i++){//增量 if(arr[i]<arr[i-d]){temp=arr[i];for(j=i-d;j>=0&&temp<arr[j];j-=d){arr[j+d]=arr[j];}arr[j+d]=temp;}}}
}int main()
{int arr[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};int n = sizeof(arr) / sizeof(arr[0]);ShellSort(arr,n);for(int i=0;i<n;++i){printf("%d--",arr[i]);}} 

5.归并排序

#include<stdio.h>
void merge(int arr[], int left[], int size_left, int right[], int size_right) 
{  int i = 0, j = 0, k = 0;  while (i < size_left && j < size_right) {  if (left[i] <= right[j]){  arr[k++] = left[i++];  } else {  arr[k++] = right[j++];  }  }  // 复制剩余的元素  while (i < size_left){  arr[k++] = left[i++];  }  while (j < size_right) {  arr[k++] = right[j++];  }  
}  // 归并排序  
void mergeSort(int *arr, int n) {  if (n <= 1) return;  int mid = n / 2;  int left[mid];  int right[n - mid];  // 复制数据到临时数组  for (int i = 0; i < mid; i++) {  left[i] = arr[i];  }  for (int i = mid; i < n; i++) {  right[i - mid] = arr[i];  }  // 递归排序左半部分和右半部分  mergeSort(left, mid);  mergeSort(right, n - mid);  // 合并两个已排序的数组  merge(arr, left, mid, right, n - mid);  }  int main()
{int arr[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};int n = sizeof(arr) / sizeof(arr[0]);mergeSort(arr, n);  for(int i=0;i<n;++i){printf("%d--",arr[i]);}
} 

6.快速排序

#include<stdio.h>
#include<stdlib.h>void swap(int* a,int* b)
{int tem=*a;*a=*b;*b=tem;
}int Partition(int* arr,int low ,int high)
{int pk=arr[low];while(low<high){while(low<high&&arr[high]>=pk)high--;arr[low]=arr[high];while(low<high&&arr[low]<pk)low++;arr[high]=arr[low];}arr[low]=pk;return low;
}
void QuickSort(int* arr,int low,int high)
{if(low<high){int pkloc=Partition(arr,low,high);//找到分界线 QuickSort(arr,low,pkloc-1);QuickSort(arr,pkloc+1,high); }
}
int main()
{int arr[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};int n = sizeof(arr) / sizeof(arr[0]);QuickSort(arr,0,n-1);for(int i=0;i<n;++i){printf("%d--",arr[i]);}}

7.堆排序

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
void siftDown(int* heap,int n,int p);
void swap(int* a,int* b)
{int tem=*a;*a=*b;*b=tem;
}
int RemoveMinKey(int* heap,int n)
{int key =heap[0];heap[0]=heap[n];siftDown(heap,n,0);return key;
}
void siftDown(int* heap,int n,int p)
{int i=p;//iint j=2*i+1;//左子树 while(j<n)//不超出范围 {if(j<n-1&&heap[j]>heap[j+1])//j为左子树,+1为右子树 j++;if(heap[i]<=heap[j])break;else{swap(&heap[j],&heap[i]);i=j;j=2*i+1;}}
}
void HeapSort(int* arr,int n) 
{int *heap=(int*)malloc(sizeof(int)*n);for(int i=0;i<n;++i){heap[i]=arr[i];}int curpos=n/2-1;while(curpos>=0){siftDown(heap,n,curpos);curpos--;}for(int i=0;i<n;++i){//printf("%d  ",heap[i]);arr[i]=RemoveMinKey(heap,n-i-1);}//printf("\n");free(heap);heap=NULL;}int main()
{int arr[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};int n = sizeof(arr) / sizeof(arr[0]);HeapSort(arr,n);for(int i=0;i<n;++i){printf("%d--",arr[i]);}}

8.计数排序

#include <stdio.h>  
#include<malloc.h>
// 计数排序函数  
void countingSort(int arr[], int n) 
{  // 找到数组中的最大值  int max = arr[0];  for (int i = 1; i < n; i++){  if (arr[i] > max) {  max = arr[i];  }  }  // 初始化计数数组  int *count = (int *)malloc(sizeof(int) * (max + 1));for(int i=0;i<=max;i++)count[i]=0; // 计算每个元素的计数  for (int i = 0; i < n; i++) {count[arr[i]]++; }  int output=0;//计数 for(int i=0;i<=max;i++)//循环每个计数盘子 {while(count[i]>0)//当盘子中数的个数大于0时,赋值到arr,并减少一个 {arr[output++]=i;//赋值给arr count[i]--;}	}free(count);  
}  int main()
{int arr[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};int n = sizeof(arr) / sizeof(arr[0]);countingSort(arr,n);for(int i=0;i<n;++i){printf("%d--",arr[i]);}} 

9.基数排序

#include <stdio.h>  
#include<malloc.h>
//基数排序
void RadixSort(int* arr, int n)
{int max = arr[0];int base = 1;//找出数组中的最大值for (int i = 0; i < n; i++){if (arr[i] > max){max = arr[i];}}//临时存放数组元素的空间int* tmp = (int*)malloc(sizeof(int)*n);//循环次数为最大数的位数while (max / base > 0){//定义十个桶,桶里面装的不是数据本身,而是每一轮排序对应(十、白、千...)位的个数//统计每个桶里面装几个数int bucket[10] = { 0 };for (int i = 0; i < n; i++){//arr[i] / base % 10可以取到个位、十位、百位对应的数字bucket[arr[i] / base % 10]++;}//循环结束就已经统计好了本轮每个桶里面应该装几个数//将桶里面的元素依次累加起来,就可以知道元素存放在临时数组中的位置for (int i = 1; i < 10; i++){bucket[i] += bucket[i - 1];}//循环结束现在桶中就存放的是每个元素应该存放到临时数组的位置//开始放数到临时数组tmpfor (int i = n - 1; i >= 0; i--){tmp[bucket[arr[i] / base % 10] - 1] = arr[i];bucket[arr[i] / base % 10]--;}//把临时数组里面的数拷贝回去for (int i = 0; i < n; i++){arr[i] = tmp[i];}base *= 10;}free(tmp);
}int main()
{int arr[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};int n = sizeof(arr) / sizeof(arr[0]);RadixSort(arr,n);for(int i=0;i<n;++i){printf("%d--",arr[i]);}} 

参考:https://www.cnblogs.com/onepixel/p/7674659.html

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

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

相关文章

什么叫USDT(泰达币)的前世今生!

一、引言 在数字货币的世界里&#xff0c;USDT&#xff08;Tether USDT&#xff09;以其独特的稳定机制&#xff0c;成为了连接传统金融市场与加密货币市场的桥梁。本文将带您了解USDT的诞生背景、发展历程、技术特点以及未来展望。 二、USDT的诞生背景 USDT是Tether公司推出…

antd:动态获取菜单

修改 app.tsx 文件 修改 getInitialState 方法 export async function getInitialState(): Promise<{...menuData?: MenuDataItem[] | undefined;fetchMenuList?: Promise<MenuDataItem[] | undefined>; }> {...const fetchMenuList async () > {const men…

【服务器部署篇】Linux下Node.js的安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0c;产…

ChatGPT的工作原理,这篇文章说清楚了!

作者&#xff1a;史蒂芬沃尔弗拉姆&#xff08;Stephen Wolfram&#xff09;英、美籍 计算机科学家&#xff0c; 物理学家。他是 Mathematica 的首席设计师&#xff0c;《一种新科学》一书的作者。 ChatGPT 能够自动生成一些读起来表面上甚至像人写的文字的东西&#xff0c;这…

《Docker实际应用场景:开发、测试、CI/CD、微服务和容器编排》

Docker实际应用场景&#xff1a;开发、测试、CI/CD、微服务和容器编排 1. 引言 Docker 已成为现代软件开发和部署的重要工具&#xff0c;其在开发、测试、持续集成/持续交付 (CI/CD)、微服务和容器编排等方面的应用尤为广泛。本篇博客将通过具体的案例和场景说明 Docker 在这…

《庆余年算法番外篇》:范闲通过最短路径算法在阻止黑骑截杀林相

剧情背景 在《庆余年 2》22集中&#xff0c;林相跟大宝交代完为人处世的人生哲理之后&#xff0c;就要跟大宝告别了 在《庆余年 2》23集中&#xff0c;林相在告老还乡的路上与婉儿和大宝告别后 范闲也在与婉儿的对话中知道黑骑调动是绝密&#xff0c;并把最近一次告老还乡梅…

汇智知了堂实力展示:四川农业大学Python爬虫实训圆满结束

近日&#xff0c;汇智知了堂在四川农业大学举办的为期五天的校内综合项目实训活动已圆满结束。本次实训聚焦Python爬虫技术&#xff0c;旨在提升学生的编程能力和数据分析能力&#xff0c;为学生未来的职业发展打下坚实的基础。 作为一家在IT教育行业享有盛誉的机构&#xff…

代码随想录算法训练营Day7|454.四数相加II、 383. 赎金信、15. 三数之和、 18. 四数之和

454.四数相加II 四个数组分成两组进行for循环&#xff0c;先用HashMap存储所有第一组for循环出现的和的次数。再进行第二组for循环&#xff0c;每一次得出的和判断其负数是否在map的key中&#xff0c;如果存在&#xff0c;就加上这个value。 class Solution {public int four…

C++数据结构之:队Queue

摘要&#xff1a; it人员无论是使用哪种高级语言开发东东&#xff0c;想要更高效有层次的开发程序的话都躲不开三件套&#xff1a;数据结构&#xff0c;算法和设计模式。数据结构是相互之间存在一种或多种特定关系的数据元素的集合&#xff0c;即带“结构”的数据元素的集合&am…

嵌入式不一定只能用C!

嵌入式不一定只能用C! ---------------------------------------------------------------------------------------手动分割线-------------------------------------------------------------------------------- 本文章参考了以下文章&#xff1a; 这里是引用 ------------…

高级数据结构-树状数组

基本知识&#xff1a; 1.lowbit运算 int lowbit(int x){return x & -x; } 2.树状数组及其应用 a[N]是原始数组&#xff1b; c[N]是树状数组&#xff0c;存放数组a中i号位之前的lowbit(i)个元素之和&#xff0c;c[i]覆盖长度是lowbit(i) 特别强调 树状数组的下标必须从…

LIMS系统在建设行业中的应用

1、保证实验室检验检测业务效率及质量 通过系统对实验室实验业务流程进行管控&#xff0c;提高各个业务环节工作效率&#xff0c;对报表、记录、报告、各类文件实现电子化管理&#xff0c;避免了人工打印和传递&#xff0c;提高实验室检验检测工作业务水平。应用更先进的自动化…

现场辩论赛活动策划方案

活动目的&#xff1a; 技能竞赛中的辩论环节既可以考核员工的知识点&#xff0c;同时也可以考核员工业务办事能力&#xff0c;表达能力&#xff0c;是一种比较全面且较有深度的竞赛方式。 辩论赛细则&#xff1a; 1、时间提示 : 自由辩论阶段&#xff0c;每方使用时间剩…

springcloud项目部署Nginx+Gateway+其他服务

一. 部署 Nginx&#xff1a; Nginx 是一个高性能的 Web 服务器和反向代理服务器。它常用于将流量从公共互联网引导到内部的应用程序服务器。你可以在服务器上安装 Nginx&#xff0c;并根据你的需求进行配置。通常的配置包括监听端口、定义服务器块、配置反向代理、设置 SSL/TL…

中老年人交友市场的现状与趋势分析

随着社会的发展和人口老龄化的加剧&#xff0c;中老年人的社交需求日益增长&#xff0c;这为交友市场带来了新的机遇和挑战。本文将从中老年人的社交需求出发&#xff0c;对当前中老年人交友市场的现状、问题及未来发展趋势进行深入分析。 一、中老年人交友市场的现状 1. 市场…

华为云会议对接,华为云会议事件消息订阅

最近做了一个对接华为云视频会议接口&#xff0c;订阅华为云会议事件消息的功能。做之前在网上搜索了一番&#xff0c;居然发现没有一个这方面的资料。决定整理一下分享出来&#xff0c;留给有缘人 具体的需求是&#xff0c;我们的app上集成了华为云会议sdk&#xff0c;在用户开…

【CTF-Web】XXE学习笔记(附ctfshow例题)

XXE 文章目录 XXE0x01 前置知识汇总XMLDTD &#xff08;Document Type Definition&#xff09; 0x02 XXE0x03 XXE危害0x04 攻击方式1. 通过File协议读取文件Web373(有回显)Web374(无回显) Web375Web376Web377Web378 0x01 前置知识汇总 XML 可扩展标记语言&#xff08;eXtensi…

Android音频焦点

什么是音频焦点&#xff1f; 音频焦点是 API 8 中引入的一个概念。它用于传达这样一个事实&#xff1a;用户一次只能专注于一个音频流&#xff0c;例如收听音乐或播客&#xff0c;但不能同时关注两者。在某些情况下&#xff0c;多个音频流可以同时播放&#xff0c;但只有一个是…

2021职称继续教育--实行高水平对外开放,积极参与全球经济治理体系改革,开拓合作共赢新局面

单选题&#xff08;共7题&#xff0c;每题5分&#xff09; 1、根据本讲&#xff0c;我国目前已有&#xff08;&#xff09;个省份设立了自贸区。 C、21 2、根据本讲&#xff0c;“一带一路”的官方翻译为&#xff08;&#xff09;。 A、The Belt and Road Initiative 3、根据…

故障诊断 | 基于KAN故障诊断模型

效果一览 文章概述 故障诊断 | 基于 KAN故障诊断模型。KAN是一种全新的神经网络架构&#xff0c;它与传统的MLP架构不同&#xff0c;能够用更少的参数量在Science领域取得惊人的表现&#xff0c;并且具备可解释性&#xff0c;有望成为深度学习模型发展的一个重要方向。运用KAN&…