文章目录
🎉前言
本人是西安邮电大学一名普通的大二学生,希望这篇关于插入排序的博客对你有用
点个赞嘛
以下动图均来自https://www.r2coding.com/#/
🚕交换数据函数(SwapData)
这个函数会经常用到
void SwapData(int* pa, int* pb)
{
int tmp = *pa;
*pa = *pb;
*pb = tmp;
}
🦽 寻找中间值做key的函数(GetMidi)
这个再快排那里会用到
int GetMidi(int* a,int left, int right)//寻找中间值做key
{
int midi = left + ((right - left) >> 2);
if (a[left] < a[midi])
{
if (a[midi] < a[right])
{
return midi;
}
else if (a[left]>a[right])
{
return left;
}
else
{
return right;
}
}
else
{
if (a[midi] > a[right])
{
return midi;
}
else if (a[left] < a[right])
{
return left;
}
else
{
return right;
}
}
}
🚒 堆排序
🎈冒泡排序
冒泡排序动图解释:
冒泡就是每次把最大或者最小的挪到最边
这个代码不难理解,相信大家初学C语言就了解到了冒泡排序
// 冒泡排序
void BubbleSort(int* a, int n)
{
int i = 0;
int j = 0;
for (i = 0; i < n; i++)
{
int exchange = 0;//加一个判断条件,比如:如果第x趟是有序的直接结束掉循环,return掉
for (j = 0; j < n - i - 1; j++)
{
if (a[j] > a[j + 1])
{
SwapData(&a[j], &a[j + 1]);
exchange = 1;//有交换的话置为1
}
}
if (!exchange)//没有交换就返回
{
return;
}
}
}
🏍️插入排序
什么是插入排序
个人理解插入排序类似于打牌
幸运女神在微笑,胜利女神在微笑
🎉插入排序代码实现
void InsertSort(int* a, int n)//想象自己在打扑克
{
int i = 0;
for (i = 0; i < n - 1; i++)//先是第一个和第二个开始比较
{
int end = i;//end是下标
int tmp = a[end + 1];
while (end >= 0 && tmp < a[end])
{
a[end + 1] = a[end];
end--;
}
a[end + 1] = tmp;//用3 1 2 作为测试用例就可以理解为什么是a[end+1]=tmp
}
}
🚙希尔排序
希尔排序和插入排序差不了多少,只是每次比较的间距从1变成了一个变量,这个变量 gap根据数据的数量而定,不过最后gap还是要等于1
动图演示:
// 希尔排序
void ShellSort(int* a, int n)
{
int gap = n;//n=2的时候代入一下
while (gap > 1)//gap=1的时候已经执行一次代码了,然后再判断的。
{
gap = gap / 3 + 1;
int i = 0;
<