emmm,接下来想写一写十大经典排序算法。
咱先来看看冒泡排序的动画
lv_0_20221117105428
冒泡排序的核心:通过对相邻数组元素进行比较,满足交换条件,实现交换即可。
基础版冒泡排序:
双重循环实现:
#include<stdio.h>
//双重循环的冒泡排序
int main()
{
//数据初始化
int arr[15] = { 3,44,38,5,47,15,36,26,27,2,46,4,19,50,48 };
int i;
//每一趟排序
for (i = 14; i >= 0; i--)
{
//得到每一趟排序的结果
int j;
for (j = 0; j < i; j++)
{
if (arr[j] > arr[j + 1])
{
//满足交换条件则交换数据
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
//遍历数组元素输出结果
int m = 0;
for (m; m < 14; m++)
{
printf("%d ", arr[m]);
}
return 0;
}
递归实现
#include<stdio.h>
//递归的冒泡排序:
void sort(int* arr, int length)
{
//递归终止条件
if (length < 2)
{
return;
}
else
{
int i = 0;
int temp;
//完成一整趟排序
for (i; i < length - 1; i++)
{
//判断大小,是否交换
if (*(arr + i) > *(arr + i + 1))
{
//引入第三个变量交换数据
temp = *(arr + i + 1);
*(arr + i + 1) = *(arr + i);
*(arr + i) = temp;
}
}
}
sort(arr,length - 1);
}
int main()
{
int arr[15] = { 3,44,38,5,47,15,36,26,27,2,46,4,19,50,48 };
int length = sizeof(arr) / sizeof(arr[0]); //计算数组大小
sort(arr, length); //调用排序函数
//打印数据
int i = 0;
for (i; i < length; i++)
{
printf("%d ", arr[i]);
}
}
改进版冒泡排序:
当冒泡排序进行到这样一个情况,我们惊奇地发现:唉,不是已经排好了吗?别排了,咱输出数据吧!显然基础的冒泡排序可不管你排没排好,于是我们可以稍微做一个优化:引入一个标志变量,通过它的值来决定是否继续排序,那什么情况代表可以结束排序呢?显然当进行一趟排序后并没有交换数组元素的值就代表完成排序了!于是我们有如下代码:
#include<stdio.h>
int main()
{
//创建数组,接收数据
int array[15] = { 3,44,38,5,47,15,36,26,27,2,46,4,19,50,48 };
int i, j, k, l, m;
//声明一个标志变量,用来判断某一次的排序过程是否存在数组元素的交换
int flag = 1;
//外层循环控制次数
for (j = 14; j >= 0 && flag == 1; j--)
{
//假设当前数组元素已经完成了排序
flag = 0;
//内层循环控制排序
for (k = 0; k < j; k++)
{
if (array[k] > array[k + 1])
{
//引入第三个变量,达到排序的目的
l = array[k];
array[k] = array[k + 1];
array[k + 1] = l;
//一旦执行了flag = 1代表程序进入了if这个分支语句中,即表明该次循环任然存在数组元素的交换,即未完成排序。
flag = 1;
}
}
}
//遍历数组打印数据
for (m = 0; m < 15; m++)
{
printf("%d ", array[m]);
}
return 0;
}
递归的改进版就不写了,希望我能更新完十个经典排序算法!
加油!