冒泡排序:两两相邻的元素比较,不满足顺序,便交换两个元素(由升降序判断)
如:1 2 3 4 5 6 7 排成降序
第一趟: ①1与2比,不满足,则交换变成 2 1 3 4 5 6 7
②1与3比,不满足,则交换变成 2 3 1 4 5 6 7
......
第一躺冒泡排序后,变为 2 3 4 5 6 7 1【进行多次比较交换后,数字放到了它应该出现的位置】
以此类推,第二趟冒泡排序后,变成 3 4 5 6 7 2 1
第三趟冒泡排序后,变成 4 5 6 7 3 2 1
......
第六趟冒泡排序后,变成 7 6 5 4 3 2 1
n个元素要进行(n-1)趟冒泡排序
例如:输入人数n,再依次输入n个同学的成绩。
输出n个同学成绩中成绩最好的前五名。
int main()
{
int n = 0;
int arr[40] = { 0 };
scanf("%d", &n);
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
//冒泡排序
for (i = 0; i < n - 1; i++) //循环一次进行一趟冒泡排序
{
int j = 0;
for (j = 0; j < n - 1 - i; j++) //在一趟冒泡排序中循环进行比较交换
{
if (arr[j] < arr[j + 1]) //比大小,并交换顺序
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
for (i = 0; i < 5; i++) //循环打印出数组元素排序后的前五个
{
printf("%d ", arr[i]);
}
return 0;
}
拓展:也可以用库函数实现自动排序
qsort(arr , n , 4 , cmp_int);
qsort(要比较的数组,数组的大小,元素大小(占4四个字节),自定义的函数名)
int cmp_int(void* e1, const void* e2)
{
return(*(int*)e2 - *(int*)e1); // (int*)进行强制类型转换
}
int main()
{
int n = 0;
int arr[40] = { 0 };
scanf("%d", &n);
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
qsort(arr,n,4,cmp_int); //自动排序函数
for (i = 0; i < 5; i++) //循环打印出数组元素排序后的前五个
{
printf("%d ", arr[i]);
}
return 0;
}