冒泡排序:
把第一个元依次与后面的元素比较,若大于后面的元素,2树交换位置,继续和后面的元素比较。此为一次比较过程,重复此过程。
#include <stdio.h>
int main()
{
int a[11],i,j,t;
printf("Input 10 numbers:\n");
for(i=1;i<11;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=1;j<=9;j++)
for(i=1;i<=10-j;i++)//排序时第一次比较9次,第二次比较8次...只需比较9次即可 if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
printf("The sorted numbers:\n");
for(i=1;i<11;i++)
printf("%d ",a[i]);
}
快速排序:
(1)从high指向的记录开始,向前找到第一个关键字值小于pivotkey的记录,将其放到low指向 的位置;
(2)从low指向的记录开始,向后找到第一个关键字的值大于pivotkey的记录,将其放到high指向的位置;
重复 (1)、(2)直到low=high,将pivotkey放在low(high)指向的位置,这样就完成了一次排序的过程。
(3)分别对(0,low-1),(low+1,high)的元素继续进行快速排序。
光看解释不好理解,先上一张排序的图解
prvotkey 3 4 2 5 1 初始时,一般选择第一个元素即3为关键元素
3 low high
1 4 2 5 1 第一次排序时,high指向的元素比关键元素小,把low覆盖,high位置不变,++low
low high
1 4 2 5 4 第二次排序时,low指向的元素比关键元素大,把high覆盖,--high
low high
1 2 2 5 4 第三次排序,high指向5大于3,--high,指向2小于3,覆盖low,low++
low(high)
1 2 3 5 4 low和high相等,把关键元素(prvotkey)覆盖low(high)第一趟排序结束。
经过一趟排序,关键元素(3)就找到他再这些元素所在的位置,不断递归调用,就能实现排序,使用与n数值较大的场合。
#include <stdio.h>
int partions(int l[],int low,int high) { int prvotkey=l[low]; l[0]=l[low]; while (low<high) { while (low<high&&l[high]>=prvotkey) --high; l[low]=l[high]; while (low<high&&l[low]<=prvotkey) ++low; l[high]=l[low]; }
l[low]=l[0]; return low; }