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

news2024/11/17 23:30:30

算法分类

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

比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破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;//i
	int 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];
		}
		//循环结束现在桶中就存放的是每个元素应该存放到临时数组的位置


		//开始放数到临时数组tmp
		for (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.coloradmin.cn/o/1713467.html

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

相关文章

GPT-4你了解多少呢

一、引言 在人工智能&#xff08;AI&#xff09;领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术一直备受关注。近年来&#xff0c;随着深度学习技术的飞速发展&#xff0c;NLP领域也取得了显著进步。GPT-4&#xff0c;作为OpenAI公司最新发布的自然语言处理模型…

wxPython应用开发-后台线程更新大量数据到wxGrid避免ui无响应

一、问题描述 最近几天&#xff0c;我在用python开发一个数据处理的小工具。需要将xls文件中的大量数据&#xff08;少则几千行多则几万行&#xff09;读取出来后进行处理。其中一个功能是需要实现将读取到的原始数据和计算出来的结果在软件界面中以表格形式展示出来。 在pyt…

Sectigo证书介绍以及申请流程

Sectigo (原Comodo CA)是全球SSL证书市场占有率最高的CA公司&#xff0c;目前将近40%的SSL证书用户选择了Sectigo。由于其产品安全&#xff0c;价格低&#xff0c;受到大量站长的信任和欢迎。Sectigo旗下的SSL证书品牌包括Sectigo, Positive SSL, Sectigo Enterprise等。 品牌…

卷积常用网络

目录 1.AlexNet2.VGG3.GoogleNet4.ResNet5.MobileNet 1.AlexNet AlexNet是2012年ISLVRC 2012&#xff08;ImageNet Large Scale Visual Recognition Challenge&#xff09;竞赛的冠军网络。 首次利用 GPU 进行网络加速训练。使用了 ReLU 激活函数&#xff0c;而不是传统的 Si…

基于 Arm 虚拟硬件的 TinyMaix 超轻量级神经网络推理框架的项目实践

本实验过程中所显示的优惠价格及费用报销等相关信息仅在【Arm AI 开发体验创造营】体验活动过程中有效&#xff0c;逾期无效&#xff0c;请根据实时价格自行购买和体验。同时&#xff0c;感谢本次体验活动 Arm 导师 Liliya 对于本实验手册的共创与指导。 详见活动地址&#xff…

【大比武08】利用RAG技术构建档案智能问答系统

关注我们 - 数字罗塞塔计划 - # 大比武2024 本篇是参加“华夏伟业”杯第二届档案信息化公司业务与技术实力大比武&#xff08;简称“大比武 2024”&#xff09;的投稿文章&#xff0c;来自燕山大学档案馆&#xff08;校史馆&#xff09;的实际项目&#xff0c;由河北科怡科技…

拍摄的视频内容怎么做成二维码?视频在线转换成二维码的方法

怎么把拍的个人才艺视频做成二维码呢&#xff1f;现在扫码看视频是实现内容快速传播的一种常用方式&#xff0c;所以很多人会将自己拍摄的视频制作二维码图片&#xff0c;然后分享给其他人扫码获取内容&#xff0c;对于内容的传播速度及用户体验有很好的提升&#xff0c;在很多…

NTLM Relay Gat:自动化NTLM中继安全检测工具

关于NTLM Relay Gat NTLM Relay Gat是一款功能强大的NTLM中继威胁检测工具&#xff0c;该工具旨在利用Impacket工具套件中的ntlmrelayx.py脚本在目标环境中实现NTLM中继攻击风险检测&#xff0c;以帮助研究人员确定目标环境是否能够抵御NTLM中继攻击。 功能介绍 1、多线程支持…

【开发利器】使用OpenCV算子工作流高效开发

学习《人工智能应用软件开发》&#xff0c;学会所有OpenCV技能就这么简单&#xff01; 做真正的OpenCV开发者&#xff0c;从入门到入职&#xff0c;一步到位&#xff01; OpenCV实验大师Python SDK 基于OpenCV实验大师v1.02版本提供的Python SDK 实现工作流导出与第三方应用集…

Java---Cloneable接口---浅克隆和深克隆

在Java中&#xff0c;我们如何实现一个对象的克隆呢&#xff1f; 在Java中实现对象的克隆&#xff0c;我们要用到Cloneable接口。克隆也分为浅克隆和深克隆。 1.实现浅克隆 1.重写clone方法 当我们想直接通过前面已经建立好的对象来调用Object类中的clone方法时&#xff0c;…

vbs执行报错vbs没有文件拓展,双击无法打开

如果看不到文件扩展名需要设置&#xff1a; 无法双击打开vbs 一般为注册表问题 解决办法 将下方代码保存为xxx.reg Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.VBS] "VBSFile" [HKEY_CLASSES_ROOT.VBS\PersistentHandler] "{5e941d80-bf96-…

VBA让按钮消失

要求 用VBA搞小程序&#xff0c;有个录入数据的按钮&#xff0c;点击后进行录入数据的操作&#xff0c;操作完成后这个按钮就是灰的&#xff0c;点不动&#xff0c;这个怎么做&#xff1f; 实现过程 没找到让按钮变灰的方法&#xff0c;退而求其次&#xff0c;让按钮消失。 …

linux部署运维1——centos7.9离线安装部署web或java项目所需的依赖环境,包括mysql8.0,nginx1.20,redis5.0等工具

在实际项目部署运维过程中&#xff0c;如果是云服务器&#xff0c;基本安装项目所需的依赖环境都是通过yum联网拉取网络资源实现自动化安装的&#xff1b;但是对于一些特殊场合&#xff0c;在没有外部网络的情况下&#xff0c;就无法使用yum命令联网操作&#xff0c;只能通过编…

Kunpeng Pro测评使用报告

1. 概述 前段时间&#xff0c;收到两条CSDN的短信&#xff0c;邀请我参加Kunpeng Pro的测评活动。说起来&#xff0c;自己玩过的开发板已经不在少数&#xff0c;而自己作为半导体行业的从业者&#xff0c;手上开发过的芯片也有十几款&#xff0c;小到Arm Cortex-A53&#xff0…

北美互联网裁员太狠了,程序员“做管理上岸”越来越难

北美互联网现在裁员太狠了&#xff0c;“做管理上岸”这种事情在现在这种行业形势已经基本不存在了&#xff0c;这个人管理40人的团队该裁还是裁。 然而硅谷还是中国程序员心中的圣地&#xff08;华子一定程度上也是很多人的心之所向&#xff0c;技术大厂捞人&#xff0c;前后…

Excel计算两个日期之间差额天数及DATEDIF使用

一.计算两个日期之间的差额天数 1.两个日期直接相减就可以得到两个日期间隔的天数&#xff0c;这里需要注意日期格式哦 日期格式需要为XXXX/XX/XX,不能为XXXX.XX.XX&#xff0c;否则显示Value错误如下。 二.使用DATEDIF函数计算差额天数 该函数只能手写&#xff0c;好像不能自…

应对意外断电:气膜建筑的安全防护与智能管理—轻空间

气膜建筑以其独特的结构和高效的建设方式&#xff0c;广泛应用于各类场馆、仓储设施和临时展馆。然而&#xff0c;当遇到意外断电导致气膜内部无法送风时&#xff0c;如何避免气膜倒塌&#xff0c;确保建筑安全呢&#xff1f; 断电应急响应 气膜建筑配备了先进的智能控制系统&a…

从GIMPLE到RTL

从GIMPLE到RTL 从GIMPLE到RTLGIMPLE序列测试代码&#xff1a;CFG如下所示&#xff1a; 一些典型数据结构RTL生成的基本过程变量展开计算当前函数堆栈&#xff08;Stack Frame&#xff09;的初始状态变量展开的初始化对可以展开的变量进行展开操作&#xff0c;生成该变量对应的R…

day17

第一题 本题可以采用快速排序的思想&#xff0c;适应随机数指定和三指针划分数组为三个区域的思想&#xff1a; 其中指针的移动细节如上题故事&#xff0c;如下所示&#xff1a; 当a区域的商都大于k时&#xff0c;我们要查找的k位置元素就在左区域&#xff0c;我们进一步在左区…

适合源代码的加密系统

在信息化高度发展的今天&#xff0c;源代码的安全问题日益受到重视。源代码是企业或组织的核心资产&#xff0c;一旦泄露或被篡改&#xff0c;将会对其造成巨大的经济损失和声誉风险。因此&#xff0c;如何有效防止源代码的泄露和算改成为了企业和组织急需解决的问题。沙盒技术…