【算法】(C语言):冒泡排序、选择排序、插入排序

news/2024/7/8 4:50:15 标签: c语言, 排序算法, 算法

冒泡排序

  1. 从第一个数据开始到第n-1个数据,依次和后面一个数据两两比较,数值小的在前。最终,最后一个数据(第n个数据)为最大值。
  2. 从第一个数据开始到第n-2个数据,依次和后面一个数据两两比较,数值小的在前。最终,倒数第二个数据(第n-1个数据)为第二个最大值。
  3. 从第一个数据开始到第n-3个数据,依次和后面一个数据两两比较,数值小的在前。最终,倒数第三个数据(第n-2个数据)为第三个最大值。
  4. 最多重复操作n-1次。

时间复杂度:最好情况 O(n),最坏情况 O(n^{2}),平均情况 O(n^{2})

  • 若已是排好的,从开头到最后,两两比对,需要n-1次比对,无需交换,一轮结束,则时间约n,即 O(n)。
  • 若是乱序,则需最多n-1次重复操作,虽然每次重复操作的比对次数减1,但总时间约n^{2},即O(n^{2})。

空间复杂度:O(1)

  • 在原位置排序,只重复使用了用于交换的临时空间,不随数据量的变动而变动,空间使用为常量(1)。


C语言实现:(bubblesort.c)

#include <stdio.h>

/* function prototype */
void bubble(int *, int);	// bubble sort
void traverse(int *, int);	// show element one by one

/* main function */
int main(void)
{
	int arr[] = {4,2,6,9,5,1,3};
	int n = sizeof(arr) / sizeof(int);
	traverse(arr, n);

	bubble(arr, n);	
	printf("[ after bubble sort ] ");
	traverse(arr, n);
	return 0;
}

/* subfunction */
void bubble(int *array, int length)		// bubble sort
{
	for(int i = length - 1; i > 0; i--)
	{
		int ischange = 0;
		for(int j = 0; j < i; j++)
		{
			if(array[j] > array[j+1])
			{
				int tmp = array[j];
				array[j] = array[j+1];
				array[j+1] = tmp;
				ischange = 1;
			}
		}
		if(ischange == 0) return ;
	}
}

void traverse(int *array, int length)		// show element one by one
{
	printf("elements(%d): ", length);
	for(int k = 0; k < length; k++)
	{
		printf("%d  ", array[k]);
	}
	printf("\n");
}

编译链接: gcc -o bubblesort bubblesort.c

执行可执行文件: ./bubblesort



选择排序

  1. 从第一个数据开始到最后,挑选最小值,放入第一个位置。
  2. 从第二个数据开始到最后,挑选最小值,放入第二个位置。
  3. 从第三个数据开始到最后,挑选最小值,放入第三个位置。
  4. 共重复操作n-1次。

时间复杂度:最好情况 O(n^{2}),最坏情况 O(n^{2}),平均情况 O(n^{2})

  • 从开头到最后,挑选最小值,需要n-1次比对。重复n-1次操作,虽然每次重复操作的比对次数减1,但总时间约n^{2},即O(n^{2})。

空间复杂度:O(1)

  • 在原位置排序,只重复使用了用于交换的临时空间,不随数据量的变动而变动,空间使用为常量(1)。


C语言实现:(selectsort.c)

#include <stdio.h>

/* function prototype */
void select(int *, int); 	// select sort
void traverse(int *, int);	// show element one by one

/* main function */
int main(void)
{
	int arr[] = {4,2,6,9,5,1,3};
	int n = sizeof(arr) / sizeof(int);
	traverse(arr, n);

	select(arr, n);
	printf("[ after select sort ] ");
	traverse(arr, n);
	return 0;
}

/* subfunction */
int findmin(int *array, int m, int n)		// find the minimum data, return index
{
	int minindex = m, mindata = array[m];
	int j;
	for(j = m + 1; j < n; j++)
	{
		if(mindata > array[j])
		{
			minindex = j;
			mindata = array[j];
		}
	}
	return minindex;
}

void select(int *array, int length)	 	// select sort
{
	for(int i = 0; i < length - 1; i++)
	{
		int min = findmin(array, i, length);
		if(i != min)
		{
			int tmp = array[i];
			array[i] = array[min];
			array[min] = tmp;
		}
	}
}

void traverse(int *array, int length)		// show element one by one
{
	printf("elements(%d): ", length);
	for(int k = 0; k < length; k++)
	{
		printf("%d  ", array[k]);
	}
	printf("\n");
}

编译链接: gcc -o selectsort selectsort.c

执行可执行文件: ./selectsort



插入排序

  1. 第二个数据和第一个数据,两两比较,数值小的在前。
  2. 从第三个数据开始到第一个数据,依次和前面一个数据两两比较,数值小的在前。
  3. 从第四个数据开始到第一个数据,依次和前面一个数据两两比较,数值小的在前。
  4. 最多重复操作n-1次。

时间复杂度:最好情况 O(n),最坏情况 O(n^{2}),平均情况 O(n^{2})

  • 若已是排好的,无需交换,从第二个数据到最后,依次只需和前面一个数据两两比对,需要n-1次比对,则时间约n,即 O(n)。
  • 若是乱序,则除了和前面数据两两比对(需n-1次比对),还需重复往前比对,最多比对n-1次,总时间约n^{2},即O(n^{2})。

空间复杂度:O(1)

  • 在原位置排序,只重复使用了用于交换的临时空间,不随数据量的变动而变动,空间使用为常量(1)。


C语言实现:(insertsort.c)

#include <stdio.h>

/* function prototype */
void insertsort(int *, int);		// insert sort
void traverse(int *, int);		// show element one by one

/* main function */
int main(void)
{
	int arr[] = {4,2,6,9,5,1,3};
	int n = sizeof(arr) / sizeof(int);
	traverse(arr, n);

	insertsort(arr, n);
	printf("[ after insert sort ] ");
	traverse(arr, n);
	return 0;
}

/* subfunction */
void insertsort(int *array, int length)	// insert sort
{
	int ischange = 0;
	for(int i = 1; i < length; i++)
	{
		for(int j = i; j >= 0; j--)
		{
			if(array[j-1] > array[j])
			{
				int tmp = array[j];
				array[j] = array[j-1];
				array[j-1] = tmp;
				ischange = 1;
			}
			if(ischange == 0) return ;
		}
	}
}

void traverse(int *array, int length)		// show element one by one
{
	printf("element(%d): ", length);
	for(int k = 0; k < length; k++)
	{
		printf("%d  ", array[k]);
	}
	printf("\n");
}

编译链接: gcc -o insertsort insertsort.c

执行可执行文件: ./insertsort


http://www.niftyadmin.cn/n/5536485.html

相关文章

ubuntu20.04换源

一、概述 重新在联想电脑上安装ubuntu20.04系统后&#xff0c;在安装ROS过程中&#xff0c;出现了不少问题&#xff0c;其中在使用下面命令时候&#xff0c;发现如下问题。 sudo apt-get update 使用update更新当前所安装软件版本时候&#xff0c;发现报出错误&#xff0c;无法…

Vue组件化、单文件组件以及使用vue-cli(脚手架)

文章目录 1.Vue组件化1.1 什么是组件1.2 组件的使用1.3 组件的名字1.4 嵌套组件 2.单文件组件2.1 vue 组件组成结构2.1.1 template -> 组件的模板结构2.1.2 组件的 script 节点2.1.3 组件的 style 节点 2.2 Vue组件的使用步骤2.2.1 组件之间的父子关系2.2.2 使用组件的三个步…

倘若你的的B端系统如此漂亮,还担心拿不出手吗,尤其是面对客户

如果你的B端系统设计如此漂亮&#xff0c;那么通常来说&#xff0c;你不太需要担心在客户那里拿不出手。一个漂亮和易用的设计可以提升用户体验&#xff0c;增加客户对系统的满意度。 然而&#xff0c;还是有一些因素需要考虑&#xff0c;以确保你的B端系统在客户那里能够得到良…

delay与vtaskdelay的区别?

FreeRTOS中&#xff0c;delay和vTaskDelay都是用于延时任务的操作&#xff0c;但它们的应用场景和实现方式有所不同。详细了解这两者对于正确使用FreeRTOS进行嵌入式开发非常重要。本文将深入探讨FreeRTOS中的延时机制&#xff0c;尤其是delay和vTaskDelay的区别。 FreeRTOS中…

【高阶数据结构】B-数、B+树、B*树的原理

文章目录 B树的概念及其特点解析B树的基本操作插入数据插入数据模拟 分析分裂如何维护平衡性分析B树的性能 B树和B*树B树B树的分裂B树的优势 B*B*树的分裂 总结 B树的概念及其特点 B树是一颗多叉的平衡搜索树&#xff0c;广泛应用于数据库和 文件系统中&#xff0c;以保持数据…

如何将 Apifox 的自动化测试与 Jenkins 集成?

CI/CD &#xff08;持续集成/持续交付&#xff09; 在 API 测试 中的主要目的是为了自动化 API 的验证流程&#xff0c;确保 API 发布到生产环境前的可用性。通过持续集成&#xff0c;我们可以在 API 定义变更时自动执行功能测试&#xff0c;以及时发现潜在问题。 Apifox 支持…

【架构-20】死锁

什么是死锁&#xff1f; 死锁(Deadlock)是指两个或多个线程/进程在执行过程中,由于资源的互相占用和等待,而陷入一种互相等待的僵局,无法继续往下执行的情况。 产生死锁的四个必要条件: &#xff08;1&#xff09;互斥条件(Mutual Exclusion)&#xff1a;至少有一个资源是非共享…

太速科技-FMC209-基于FMC的4路125MAD输入、2路1GDA输出子卡

FMC209-基于FMC的4路125MAD输入、2路1GDA输出子卡 一、板卡概述 本子卡基于FMC连接器实现4路125M采样率AD输出&#xff0c;两路1G采样率DA输出子卡&#xff0c;板卡默认由FMC连接器12V供电&#xff0c;支持外参考时钟&#xff0c;外输入时钟&#xff0c;外触发。 …