冒泡排序
冒泡排序是一种比较简单的排序算法,它循环走过需要排序的元素,依次比较相邻的两个元素,如果顺序错误就交换,直至没有元素交换,完成排序。
若对n个人进行排序,我们需要n-1次比较,所以第k次比较需要进行n-k次比较。排序算法通过以数据对象的两两比较作为关键,所以可以得出,冒泡排序需要进行的
比较次数为:(n-1) + (n-2) + … + 1 = n*(n-1) / 2,因此冒泡排序的时间复杂度为O(n^2)
一 .传统方法(适用于小白)
数字冒泡排序
#include<stdio.h>
void bubble_sort(int *arr, int sz)
{
int i = 0;
int j = 0;
for (i = 0; i < sz - 1; i++)
{ //第一趟循环 sz-1 次
for (j = 0; j < sz - 1 - i; j++)
{ //每一趟里面需要比较的个数
if (arr[j + 1] < arr[j])
{//冒泡排序-s--两两比较,大的和小的换位置
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main()
{
int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
二. 回调函数(实现对数字,字符串的排序)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Stu
{
char name[20];
int age;
};
int cmp_int(const void* e1, const void* e2)
{
return *(int *)e1 - *(int*)e2;
}
int cmp_by_age(const void* e1, const void* e2)
{
return ((struct Stu*) e1)->age - ((struct Stu*) e2)->age;
}
int cmp_by_name(const void* e1, const void* e2)
{
return strcmp(((struct Stu*) e1)->name, ((struct Stu*) e2)->name);
}
void test1()
{
int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_int);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d\n", arr[i]);
}
}
void test2()
{
struct Stu s[3] = { {"zhangsan",20},{"lisi",18},{"wangwu",15} };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), cmp_by_age);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%s\n", s[i].name);
}
}
void test3()
{
struct Stu s[3] = { {"zhangsan",20},{"lisi",10},{"wangwu",15} };
int sz = sizeof(s) / sizeof(s[0]);
qsort(s, sz, sizeof(s[0]), cmp_by_name);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%s\n", s[i].name);
}
}
int main()
{
int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
struct Stu s[3] = { {"zhangsan",20},{"lisi",10},{"wangwu",15} };
test1();
test2();
test3();
return 0;
}