1. 冒泡排序
第一次1……n,最轻的往上走
第二次2……n,最轻的往上走
……直到第n-1次
for(i=0;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;
flag=1;
}
}
优化:设置标志位flag,如果发生了交换flag设置为true;如果没有交换就设置为false。这样当一轮比较结束后如果flag仍为false,即:这一轮没有发生交换,说明数据的顺序已经排好,没有必要继续进行下去。
for(i=0;i<n-1;i++)
{
flag=0;
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;
flag=1;
}
}
if (flag==0)
break;
}
2. 选择排序
在长度为N的无序数组中,第一次遍历n-1个数,找到最小的数值与第一个元素交换;第二次遍历n-2个数,找到最小的数值与第二个元素交换;第n-1次遍历,找到最小的数值与第n-1个元素交换,排序完成。
for (i=0;i<n-1;i++)
{
t=i;
for (j=i+1;j<n;j++)
{
if(a[t]>a[j])
{
t=j;
}
}
if(t!=i)
{
temp=a[i];
a[i]=a[t];
a[t]=temp;
}
}
3. 插入排序
在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。
while(scanf("%d",&n)!=-1)
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++)
{
for(j=i+1;j>0;j--)
{
if(a[j]<a[j-1])
{
t=a[j];
a[j]=a[j-1];
a[j-1]=t;
}
else
break;
}
}
4. 希尔排序
在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。然后逐渐将增量减小,并重复上述过程。直至增量为1,此时数据序列基本有序,最后进行插入排序。
while(scanf("%d",&n)!=-1)
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
h=4;//初始步长
for(h=4;h>=1;h=h/3)
{
for(k=0;k<h;k++)
{
for(i=k;i<n;i=i+h)
{
for(j=i;j>k;j=j-h)
{
if(a[j]<a[j-h])
{
t=a[j];
a[j]=a[j-h];
a[j-h]=t;
}
else
break;
}
}
}
}
for (i=0;i<n;i++)
printf("%d ",a[i]);
5. 快速排序
数组首位做key,i指向最前,j指向最右,从最后一位往前找比key小的,把它填到i,接着从i处往后找比key大的,填到j处,直到i=j,然后基于分治思想,左半,右半分别进行相同操作,最底层是数组只有一个元素返回。
void quicksort(int a[],int l,int r)
{
if(l>=r)return;
int i=l,j=r,key=a[l];
while(i<j)
{
while(a[j]>=key&&i<j)
{
j--;
}
if(j>i)
{
a[i]=a[j];
i++;
}
while(a[i]<key&&i<j)
{
i++;
}
if(i<j)
{
a[j]=a[i];
j--;
}
}
a[i]=key;
quicksort(a,l,i-1);
quicksort(a,i+1,r);
}
6. 归并排序
分治,左半排好,右半排好,左右合并
void hebing(int a[],int l,int m,int r,int b[])
{
int i=l,j=m+1,k=0;
while(i<=m&&j<=r)
{
if(a[i]<=a[j])
{
b[k]=a[i];
k++;i++;
}
else
{
b[k]=a[j];
k++;j++;
}
}
while(i<=m)
{
b[k]=a[i];
k++;i++;
}
while(j<=r)
{
b[k]=a[j];
k++;j++;
}
for (i = 0; i < k; i++)
a[l + i] = b[i];//值得注意
}
void merge(int a[],int l,int r,int b[])
{
int m;
if(l>=r)return;
else
{
m=(l+r)/2;
merge(a,l,m,b);
merge(a,m+1,r,b);
hebing(a,l,m,r,b);
}
}