冒泡排序法
冒泡排序法是一种排序算法,将数据进行有序的排列
如果为从小到大排列,流程如下:
首先进行第一趟排序,先对比第一个数和第二个数,将大的数放在第二个元素的为值上(交换),然后对比第二个数和第三个数,同样把大的数放在第三个位置上,以此类推,第一趟排序结束后最大的数放在最后一个位置上
然后进行第二趟排序,先对比第一个数和第二个数,把大的放在第二个数的位置上,然后对比第二个和第三个数,把大的放在第三个位置,一次类推,最后在倒数第二个位置放第二大数即可
直到所有的数据排序完毕。
如果有n个数,则需要执行n-1趟,并且每执行一次,下次比较次数会减一
例子:
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[5] = {100,50,30,40,20};
int i = 0,j = 0;
int temp = a[0];
//外层循环控制趟数,如果有n个数的,则执行n-1趟
for(i = 1; i < 5; i++)
{
//先搞定一趟排序,利用冒泡排序将最大值放在最后一个数组的位置上
for(j = 0; j < 5; j++)
{
//取前一个数和后一个数进行对比,将大的数据放在后一个位置上
if(a[j] > a[j + 1])
{
temp = a[j];
a[j] = a[j + 1];
a[j +1] = temp;
}
}
}
printf("排序后:\n:");
for(i = 0; i < 5; i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
运行结果:
排序后:
:20 30 40 50 100
简单选择法排序
如果为从小到大排列,流程如下:
首先取第一个数与后面每一个数进行对比,如果某一个数比第一个数小,则交换位置,当第一次排序结束后,第一个位置放的是最小的数据
然后在拿第二个数与后面所有的数据进行对比,如果有比第二个数小的,则交换位置,当第二次排序结束后,第二个位置放的是第二小的数据,以此类推。
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[5] = {100,50,30,40,20};
int i = 0,j = 0;
int temp = a[0];
//外层循环每次取出一个数据,然后交给内层循环进行对比
for(i = 0; i < 5 - 1; i++)
{
//内层循环从外层数据的下一个位置开始与外层取出的数据进行对比
for(j = i + 1; j < 5; j++)
{
//将小的放在外层取数的位置上
if(a[i] > a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
printf("排序后:\n:");
for(i = 0; i < 5; i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
运行结果:
排序后:
:20 30 40 50 100
找出数组中第二大的值
流程如下:
两两比较,第二个跟第一个比较,记录下大的,再把小的数赋给定义的第二大,但是这样会出现一个问题,就是如果第三个数比第二个数小但是比第一个数大,这样比较仍然记录的第二大数仍然是第一个数,所以要再来一个if用来判断第一个数跟第三个数的大小
例子:
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[5] = {100,50,30,40,20};
int i = 0,j = 0;
int max = a[0];
int sec_max = 0;
for(i = 1; i < 5; i++)
{
if(a[i] > max)
{
sec_max = max;
max = a[i];
}
else if(sec_max <= a[i])
{
sec_max = a[i];
}
}
printf("%d\n",sec_max);
return 0;
}
运行结果:
50