Table of Contents
第一章 一大波数正在靠近——排序
最快最简单的排序——桶排序
简化版桶排序(数值排序)
对数据范围在0~1000之间的整数进行排序,则需要1001个桶,记录/标记每个数出现的次数。(个人初始想法为插入排序,时间复杂度为O(N2) )
//源代码
#include <stdio.h>
int main()
{
int book[1001],i,j,t,n;
for(i=0;i<=1000;i++)//初始化book标记数组
book[i] = 0;
scanf("%d",&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);
return 0;
}
时间复杂度: 设待排序数范围为0~M即桶的个数为M,N为待排数的总数,则时间复杂度为O(M+N)
缺点: 浪费空间(排序数据受限)
邻居好说话——冒泡排序
冒泡排序的基本思想: 每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。

#include <stdio.h>
int main()
{
int a[100],i,j,t,n;
scanf("%d",&n);//待排序的n个数
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
//冒泡排序核心部分
for(i=1;i<=n-1;i++)//n-1趟
{
for(j=1;j<=n-i;j++)//比较n-i次
{
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]);
return 0;
}
每一趟只归位一个数,排序n个数则需要n-1趟。
时间复杂度: O(N2) 这也是其缺点。
最常用的排序——快速排序
快速排序的思想: 每次排序设置一个基准点,将小于等于基准点的数放到基准点的左边,将大于等于基准点的数放到基准点的右边,基于二分思想 。
#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