C语言实现各种排序算法:插入、希尔、选择、堆排、冒泡、快排、归并排序(附动图)

本文详细介绍了C语言实现的七种常见排序算法:插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序和归并排序。通过动图演示和代码展示,帮助程序员理解和掌握这些排序方法,适合面试复习。
摘要由CSDN通过智能技术生成

前言:排序是程序员在面试时经常遇到的面试题,排序方法种类繁多,常见的有插入、希尔、选择、堆排、冒泡、快排、归并排序 这7种排序方式

 

各种排序的时间复杂度:

一、插入排序:

插入排序是一种简单排序,它的思路是:每次从未排好的序列中选出第一个元素插入到已排好的序列中。它的算法步骤可以大致归纳如下:

1. 从未排好的序列中拿出首元素,并把它赋值给temp变量;

2. 从排好的序列中,依次与temp进行比较,如果元素比temp大,则将元素后移(实际上放置temp的元素位置已经空出)

3. 直到找到一个元素比temp小, 将temp放入该位置;

动图演示:

代码:

void Insertion_Sort(int *arr, int sz)
{
	int i = 0;
	int j = 0;
	for (i = 1; i < sz; i++)
	{
		int tmp = arr[i];
		for (j = i; (j > 0) && (arr[j - 1] > tmp); j--)
		{
			arr[j] = arr[j-1];
		}
		arr[j] = tmp;
	}
	printf("Insertion_Sort:");
	Print(arr, sz);
}

二、希尔排序:

希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。 该方法的基本思想是:

先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高 。

如何选择有效的希尔增量:

每一轮的希尔增量之间如果是等比的,就会导致希尔增量盲区。为了保证分组粗度没有盲区,每一轮的增量需要彼此互质。其中比较有代表性的是Hibbard增量( 2^k-1)和Sedgewick增量( 4^k - 3*2^k + 1)。

动图演示:

代码:

void Shell_Sort(int *arr, int sz)
{
	int gap = sz;//gap越小越接近有序
	while (gap > 1)
	{
		gap = gap / 3 + 1;
		for (int i = 0; i < sz - gap; i++)//每组同时进行
		{
			int end = i;
			int tmp = arr[end + gap];
 			while (end >= 0 && arr[end] > tmp)
			{
				arr[end + gap] = arr[end];
				end -= gap;
			}
			arr[end + gap] = tmp;
		}
	}
	printf("Shell_Sort:");
	Print(arr, sz);
}

三、选择排序

选择排序是一种简单直观的排序方法,遍历一遍数组,找到最小的那个元素,与数组第一个元素交换,然后,再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

而且这个方法还可以优化,定义一个左指针,定义一个右指针;左指针从前往后遍历,找到最小的元素放到

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值