排序
桶排序
原理
桶排序需要一个排列数字的范围。
一个元素个数为11的数组int a[11],并且这个数组的值是0-12。将这个数组进行大小排序。首先,申请一个大小为12的数组int b[12],将数组b的值全部初始化为0.然后遍历数组1内部的值,如果为1则b[1]++;2则b[2]++;8则b[8]++。最后通过遍历数组b,如果出现几次就打印几次,没出现(为0)的时候就不打印。
代码实现:
int book[1001],i,j,t,n;
for (i = 0; i <= 1000; i++) {
book[i] = 0;
}
printf("请输入你排序的总数");
scanf("%d",&n);//输入一个数n,表示接下来有n个数
for (i = 1 ; i <= n; i++) {//循环读入数字,并进行排序
scanf("%d",&t);
book[t]++;
}
for (i = 1000; i >= 0; i--) {
for (j = 1; j <= book[i]; j++) {
printf("%d ",i);
}
}
复杂度
第一个循环循环了m次(m为桶的个数),第二个循环循环了n次(待排序的个数),第三个循环循环了m+n次。所以整个循环循环了2(m+n)次,即O(2(m+n))。
tip:这个不是正宗桶排序,这是简化版
冒泡排序
原理
每次比较两个相邻的元素,如果他们的顺序错误就把他们交换过来
每一趟只能确定一个数归位。即第一趟只能将最后一位确定,第二趟只能将倒数第二位确定,这样一位位确定下来完成排序。
代码实现
int a[100],t,n;
printf("请输入你要排序的元素个数\n");
scanf("%d",&n);//输入一个数n,表示接下来有几个数
printf("请输入你要排序的元素中间空格隔开\n");
for (int i = 1; i <= n; i++) {
scanf("%d",&a[i]);
}
//冒泡排序核心
for (int i = 1; i <= n-1 ; i++) {
for (int j = 1; j <= n-1; j++) {
if (a[j] < a[j+1]) {
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
//输入排序后的结果
for (int i = 1; i <= n; i++) {
printf("%d ",a[i]);
}
//在这里尝试使用冒泡排序对学生成绩进行排序
struct student{
char name[21];
int score;
};//创建一个学生结构体来存储姓名和分数
struct student b[100],stu;
printf("请输入你要排序的元素个数\n");
scanf("%d",&n);//输入一个数n
for (int i = 1; i <= n; i++) {
scanf("%s %d",b[i].name,&b[i].score);
}
//按分数从高到低
for (int i = 1; i <= n-1; i++) {
for (int j = 1; j <= n-1; j++) {
if (b[j].score < b[j+1].score) {
stu = b[j];
b[j] = b[j+1];
b[j+1] = stu;
}
}
}
for (int i = 1; i <= n; i++) {
printf("%s ",b[i].name);
}
复杂度
冒泡排序的核心是双重嵌套排序。不难看出冒泡排序的时间复杂度是O(N^2);这是一个非常高的时间复杂度了。
快速排序
原理
在数据序列中选择一个值作为比较的基准值,每趟从数据序列的两端开始交替进行,将小于基准值的元素交换到序列前端,将大于基准值的元素交换到序列后端,介于两者之间的位置则成为基准值的最终位置。同时,序列被划分为两个子序列,再用同样的方法分别对两个子序列进行排序,直到子序列的长度为1,则完成序列。
代码实现
#include <stdio.h>
int a[101],n;
void quicksort(int left,int right){
int i,j,t,temp;
if (left > right) {
return;
}
temp = a[left];
i = left;
j = right;
while (i != j) {
//先从右往左找
while (a[j] >= temp && i < j) {
j--;
}
//再从左往右找
while (a[i] <= temp && i < j) {
i++;
}
//交换两个数在数组中的位置
if (i < j) {//当两者没有相遇
t = a[i];
a[i] = a[j];
a[j] = t;
}
//最终将基数值归位
a[left] = a[i];
a[i] = temp;
quicksort(left,i-1);
quicksort(i+1,right);
}
}
int main(int argc, const char * argv[]) {
//读入数据
scanf("%d",&n);
for (int i = 1; i <= n; i++) {
scanf("%d",&a[i]);
}
quicksort(1, n);
//输出排序后的结果
for (int i = 1; i <= n; i++) {
printf("%d ",a[i]);
}
return 0;
}