在做很多题目时都会用到排序,先把我遇到过的排序整理一下
冒泡排序:
接触的第一种排序方法
从第一个元素起,开始两两比较,结束之后,最大的数在数组的末尾
一共需要比较n-1次,外循环为n-1,内循环次数随外循环改变,n-1-i
#include<stdio.h>
int main()
{
int a[1001];
int i,j,n,t;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n-1;i++)
for(j=0;j<=n-i-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
选择排序:
将最小的数放在前面,然后将a[0]与a[1]比较,由小到大排序,将a[1]与a[2]比较,从小到大排序,……,将a[n]与a[n-1]比较,从小到大排序;再从剩余的n-1个数中选择最小的放在a[1]的位置,以此类推。
#include<stdio.h>
int main()
{
int a[1001];
int i,j,n,t;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
简化版桶排序:
这只是可以满足比较简单的排序的简化版
依次判断桶的编号,出现了几次就打印几次。每出现一个数,对应编号的桶+1
#include<stdio.h>
int main()
{
int a[1001];
int i,j,t,n;
for(i=0;i<1000;i++)
a[i]=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&t);
a[t]++;
}
for(i=1;i<1000;i++)
for(j=1;j<=a[i];j++)
printf("%d ",i);
return 0;
}
快速排序:
设置一个基准数,将比基准数小的数放左边,比基准数大的数放在其右边
#include<stdio.h>
int a[101],n;
void quicksort(int left,int right)
{
int i,j,temp,t;
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 i;
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]);
return 0;
}
冒泡排序是将最大的数先放后面;选择排序是将最小的数先放前面;简化版桶排序是每出现一个数,就将对应编号的桶内+1;快速排序需要设置基准点