一、冒泡排序的思想
两两相邻的元素进行比较,并且有可能的话需要交换
二、冒泡排序的3种方法
2.1第一种以10个数为例
升序
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int m = 0;
for (m = 0; m < 10; m++)
{
scanf("%d", &arr[m]);//输入10个数放进数组里面去
}
for (m = 1; m < =10; m++)//冒泡排序进行的趟数
{
int j = 0;
for (j = 0; j < 10-m; j++)//一趟冒泡排序要进行多少对元素的比较
{
int temp = 0;
if (arr[j] > arr[j + 1])
{
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
for (m = 0; m < 10; m++)//打印冒泡排序排序好之后的数组
{
printf("%d ", arr[m]);
}
return 0;
}
运行结果:
2.2 第二种在第一种的情况下进行优化升级
升序
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int sz = 0;
sz = sizeof(arr) / sizeof(arr[10]);//表示数组的元素个数
int m = 0;
for (m = 0; m < sz; m++)
{
scanf("%d", &arr[m]);
}
for (m = 1; m <=sz; m++)//冒泡排序进行的趟数
{
int j = 0;
int flag = 1;//假设待排序的数组中的元素已经有序
for (j = 0; j < sz-m; j++)//对未排序元素进⾏冒泡排序
{
int temp = 0;
if (arr[j] > arr[j + 1])
{
flag = 0;//只要交换说明正在排序的数据不是有序的
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
if (flag == 1)//当前序列已经是升序状态,结束循环
{
break;
}
}
for (m = 0; m < sz; m++)
{
printf("%d ", arr[m]);
}
return 0;
}
运行结果:
2.3第三种qsort 函数进行冒泡排序
qsort() 函数的声明:
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
参数:
base – 指向要排序的数组的第一个元素的指针。
nitems – 由 base 指向的数组中元素的个数。
size – 数组中每个元素的大小,以字节为单位。
compar – 用来比较两个元素的函数。
头文件:stdlib.h
#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
int main()
{
int arr[10] = { 0 };
int sz = 0;
sz = sizeof(arr) / sizeof(arr[10]);//表示数组的元素个数
int m = 0;
for (m = 0; m < sz; m++)
{
scanf("%d", &arr[m]);
}
qsort(arr,sz,4, cmp_int);
for (m = 0; m < sz; m++)
{
printf("%d ", arr[m]);
}
return 0;
}
运行结果:
如果这个想让他降序排序可以将下面这行代码中的两个交换位置:
欧耶!!!!我学会啦!!!!!