对数组进行排序是c语言中比较常见的事情了,接下来笔者就带着大家聊聊排序那些事。
话不多说,代码呈上
冒泡排序:
#include<stdio.h>
#include<stdlib.h>
#define MAX 3
//冒泡排序
int main()
{
int a[MAX] = { 9,6,14 };
int i = 0;
int t = 0;
int j = 0;
for (i = 0; i < MAX; i++)
{
for (j = 0; j < (MAX-1) - i; j++)//此处的MAX-1-i不是MAX-i的原因是j+1不会越界;
{
if (a[j + 1] > a[j])//外层循环循环一次就会把较大数往前移一位
{
t = a[j + 1];
a[j + 1] = a[j];
a[j] = t;
}
}
}
for (i = 0; i < MAX; i++)
{
printf("%d ", a[i]);
}
system("pause");
return 0;
}
核心思想:
对于冒泡排序相信大家都比较熟悉,它的核心思想是,假如是将数组从大到小排序,外层for循环执行一次,数组中最大的那个数将向前移一位。所以外层for循环的循环次数最多是数组的的元素个数次。而内层for循环的循环次数如for (j = 0; j < (MAX-1) - i; j++)//此处的MAX-1-i不是MAX-i的原因是j+1不会越界,因为后面会有a[j+1]和a[j]的判断。
要实现将数组是从大到小还是从小到大,只需要改变三个变量的交换位置即可。
选择排序:
#include<stdio.h>
#include<stdlib.h>
//选择排序
int main()//主函数
{
int a[10];
int i, j, w;
printf("请输入10个数字: \n");
for (i = 0; i < 10; i++)
scanf("%d", &a[i]);
for (i = 0; i < 10; i++)
{
for (j = i + 1; j < 10; j++)
if (a[i] < a[j])//进行比较
//比较后进行交换
{
w = a[i];
a[i] = a[j];
a[j] = w;
}
}
printf("排序后:\n");
for (i = 0; i < 10; i++)
printf("%d ", a[i]);
printf("\n");
system("pause");
return 0;
}
核心思想:
for (i = 0; i < 10; i++)
{
for (j = i + 1; j < 10; j++)
if (a[i] < a[j])
{
w = a[i];
a[i] = a[j];
a[j] = w;
}
}
如代码所示,选择排序更简单,外层for将数组的第一个元素假设成最大的或者最小的元素,然后内层for将i+1个元素与第一个元素相比,就能找到数组中最大的元素,以此类推,依次找到第二大、第三大........。
结论浅析:
对于选择排序的分析是很简单的,输入的规模由数组元素决定,基本操作是键值比较A[j]<A[min]。因此,对于任何输入来说,选择排序都是一个O(n^2)的算法。因此,这个实验的时间复杂度为O(100),空间复杂度为O(10)。然而,键的交换次数仅为O(n),或者更精确一点,是n-1次(i循环每重复一次执行一次交换)。这个特性使得选择排序优于许多其他的排序算法。
冒泡排序就是相邻两个数相比较,大数就沉底(或者小数上浮的过程),总共进行了n-1次比较和交换。上面的冒泡算法为了便于算法的实现,所以考虑只使用一个一维数组来存放10个整型数据。排序过程中数据始终在这个数组中(原地操作,不占用额外的空间)。所以该算法的时间复杂度为O(n-1),空间复杂度为O(1)。