朋友们,这是看完书总结的东西,语句可能不通顺什么的,有地方我还不懂,可能还有错误什么的,望大佬指正。
桶排序
(所用空间大 但是快)
定义很多空间,向其中放入东西。
例子:数据范围在0~1000的数据进行从大到小的排序
#include<stdio.h>
int main()
{
int book[1001],i,j,t,n;
for(i=0;i<=1000;i++)
book[i]=0;
scanf("%d",&n);//输入一个数n,表示接下来有n个数
for (i=1;i<=n;i++)//循环读入n个数,并进行桶排序
{
scanf("%d",&t);//把每个数读到变量t中
book[t]++; //进行计数,对编号为t的桶放一个小旗子
}
for(i=1000;i>=0;i--)//依次判断编号为1000-0的桶
for(j=1;j<=book[i];j++)//出现了几次就将桶的编号打印几次
printf("%d ",i);
getchar();getchar();
//这里我不懂哎 书上说用来暂停程序,以便查看程序输出的内容
return 0;
}
冒泡排序
(时间复杂度极大)
每次比较两个相邻元素,如果他们顺序错误就把他们交换
例子:第一行输入排序的个数,第二行输入数字
#include <stdio.h>
int main() {
int a[100], i, j, t, n;
scanf("%d", &n); //输入一个数n,表示下面有n个数
for(i = 1; i <= n; i++) { //循环读入n个数到数组a中
scanf("%d", &a[i]);
}
for(i = 1; i <= n-1; i++) { //n个数排序,用n-1趟
for(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(i = 1; i <= n; i++) { //输出结果
printf("%d ", a[i]);
}
getchar(); getchar();
//注释掉上面这句也行,qwq真不知道他干嘛
return 0;
}
快速排序
(二分思想)
从两边开始,再找基准点
i,j 两边向中间走,分别寻找大于/小于基准数的数,只到i和j碰头为止
每次将两边的两坨进行排序找基准数。
例子:第一行输入排序的个数,第二行输入数字
#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]; //temp内存的就是基准数
i = left;
j = right;
while(i!=j) {
//从右向左找
while(a[j] >= temp && i < j) {
j--;
}
//从左向右找
while(a[i] <= temp && i < j) {
i++;
}
//交换两个数在数组中的位置
if(i < j) { //当哨兵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); //继续处理右边的
return;
}
int main() {
int i,j;
//读入数据;
scanf("%d", &n);
for(i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
quicksort(1,n);
for(i = 1; i <= n; i++) {
printf("%d ", a[i]);
}
getchar(); getchar();
return 0;
}