选择排序,冒泡排序,插入排序,快速排序及其优化

本文详细介绍了选择排序、冒泡排序、插入排序和快速排序的基本原理、具体步骤、代码实现以及优化策略,展示了这些经典排序算法的实现和改进方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1 选择排序

1.1 原理

1.2 具体步骤 

1.3 代码实现

1.4 优化

2 冒泡排序

2.1 原理

2.2 具体步骤

2.3 代码实现

2.4 优化

3 插入排序

3.1 原理

3.2 具体步骤 

3.3 代码实现

3.4 优化

4. 快速排序 

4.1 原理

4.2 具体步骤

4.3 代码实现 

4.4 优化 


为了讲解方便,以下排完序后,统一为升序

1 选择排序

1.1 原理

核心思想是通过不断地选择未排序序列中的最小元素,然后将其放到已排序序列的末尾(或未排序列的起始位置)

 

1.2 具体步骤 

1. 初始状态:所有元素初始都为未排序状态

2 在未排序元素中,找到最小的那个元素的下标

3 与未排序的第一个元素(已排序的末尾元素)交换位置

4 循环 2 ~ 3,直到所有元素都变为已排了的元素

1.3 代码实现

代码实现的关键点:找下标,换位置,以及循环条件。同时也是容易出错的点。

#include<stdio.h>

void sort(int* p, int n)
{
	for (int i = 0; i < n - 1; i++) // < n 也可以,只是无意义的重复,效率更低
	{
		int min = i;   // 找出的最小值,最后要放的位置的下标
		int j = i;
		for (j = i + 1; j < n; j++)  // 可以=i,只是=i,无意义。
		{
			if (p[min] > p[j])
				min = j;	
			//  for循环结束后,j会++  
			if (n - 1 == j)
				break;
		}
		// 交换数据
		int temp = p[i];
		p[i] = p[min];
		p[min] = temp;
	}
}

int main()
{
	int arr[] = { 9,6,8,-1,0,5,2,8 };
	int sz = sizeof(arr) / sizeof(arr[0]);

	sort(arr, sz);  // 选择排序

	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

1.4 优化

 原来一趟只找出最小值,现在一趟既找出最小值,也找出最大值,循环的次数就减半了。

#include<stdio.h>

void swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

void sort(int* p, int n)
{
	// 循环趟数减半,可以了就要停止,不然就会继续换,反而无序
	for (int i = 0; i <= n / 2 + 1; i++) 
	{
		int min = i;   // 找出的最小值的下标
		int max = n -i - 1; // 找出的最大值的下标
		int j = i;
		for (j = i; j < n - i; j++) 
		{
			if (p[min] > p[j])
				min = j;
			if (p[max] < p[j])
				max = j;
			if (n - 1 - i == j)
				break;
		}
	
		// 交换数据
	   // 当最小值与最大值恰好位置相反,换两次=没换
		if (!(p[min] == p[n - 1 - i] || p[i] == p[max]))
		{
			swap(&p[i], &p[min]);
			swap(&p[n - 1 - i], &p[max]);
		}
		else
		{
			swap(&p[i], &p[n - 1 - i]);
		}
	}
}

int main()
{
	int arr[] = { 9,6,8,-1,0,5,2,8 };
	int sz = sizeof(arr) / sizeof(arr[0]);

	sort(arr, sz);  // 选择排序优化

	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

2 冒泡排序

评论 57
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值