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

冒泡排序

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

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

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

空间复杂度:O(1)

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

C语言实现:(bubblesort**.**c)

cpp 复制代码
#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(),最坏情况 O(),平均情况 O()

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

空间复杂度:O(1)

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

C语言实现:(selectsort**.**c)

cpp 复制代码
#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(),平均情况 O()

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

空间复杂度:O(1)

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

C语言实现:(insertsort**.**c)

cpp 复制代码
#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

相关推荐
JustCouvrir1 小时前
代码随想录算法训练营Day5
算法
只对您心动1 小时前
【C高级】有关shell脚本的一些练习
linux·c语言·shell·脚本
周哈里窗的编程2 小时前
CSP-CCF★201912-2回收站选址★
c++·算法·图论
SpongeG3 小时前
数据结构第三周做题总结_链表
数据结构·算法·链表
everyStudy3 小时前
前端五种排序
前端·算法·排序算法
小珑也要变强3 小时前
队列基础概念
c语言·开发语言·数据结构·物联网
little redcap5 小时前
第十九次CCF计算机软件能力认证-乔乔和牛牛逛超市
数据结构·c++·算法
muyierfly5 小时前
34.贪心算法1
算法·贪心算法
咩咩大主教6 小时前
C++基于select和epoll的TCP服务器
linux·服务器·c语言·开发语言·c++·tcp/ip·io多路复用
时光飞逝的日子7 小时前
多重指针变量(n重指针变量)实例分析
c语言·指针·多重指针·双重指针·n重指针·指针变量