三种排序对比:选择法,插入法,冒泡法html
三种排序都是最基本的,时间复杂度最大为O(n*n)的排序方法。这里给出的是采用数组形式的简单序列排序(从小到大)。数组
/*选择法*/
/*选择法的基本思路:第一次,从第一个记录后面待排序的的记录中,选出最小的,和第一个交换。而后,循环作n次,这样排完后成序*/
/*选择法排序是不稳定的:由于两个相同的记录偏偏要反序放置*/
#include
int main()
{
int a[10]={4,6,8,2,0,1,5,7,3,9};/*定义数组*/
int i,j,k;
for(j=0;j
for(i=j+1;i
if(a[i]
k=a[i];
a[i]=a[j];;
a[j]=k;
}/*用中间变量k作交换*/
for(j=0;j<=9;j++)printf("%d\n",a[j]);
system("pause");
}数据结构
/*冒泡法*/
/*冒泡法的基本思路和选择法不一样,以下程序,第一次,经过记录的“两两”比较将全部记录中最大的记录放到最后去。而后循环9次便可*/
/*冒泡法排序是稳定的:冒泡的过程当中相同的记录位置不会变*/
#include
int main()
{
int a[10]={4,6,8,2,0,1,5,7,3,9};
int i,j,k;
for(j=0;j
for(i=0;i
if(a[i]>a[i+1]){
k=a[i];
a[i]=a[i+1];
a[i+1]=k;
}
for(j=0;j<=9;j++)printf("%d\n",a[j]);
system("pause");
}htm
/*插入法*/
/*插入法的的意思就和咱们抓牌同样,把记录分为有序和无序两区。把无序区中的每一个数“挨个”拿来和有序区的数比较。比有序区小的位置保持不变,大的话先挪动位置空出来,再插入*/
/*插入法也是稳定的:插入的过程当中相同的记录位置不变。*/
#include
int main()
{
int a[10]={9,2,2,5,6,7,4,5,1,0},i,j,k,m;
for(i=1;i<=9;i++)
{
m=a[i]; /*将a[i]先拿出来*/
for(j=i-1;j>=0 && mblog
/*在挪位置后要保存j的值即插入位置:j-- 。因此 循环终止条件有m ]*/
a[j+1]=a[j];
a[j+1]=m; /*大的从新原位置插入,小的在挪动后的位置插入*/
}
for(k=0;k<=9;k++)
printf("%d\n",a[k]);
system("pause");
}排序
大部分数据结构书上插入排序的写法,感受用while反而不太清楚:get
#include
int main()
{
int i,j,k,l;
int a[10]={4,6,8,2,0,1,5,7,3,9};
for(i=1;i<=9;i++) /*第一个a[0]做为有序的。从第二个依次拿来比较*/
{
k=a[i];/*比较的数先抽出来放到中间变量k中*/
j=i-1; /*用j作循环判断,从“右到左”依次比较!*/
while(j>=0 && a[j]>k) /*若是比k大且不为a[-1]则挪位置*/
{
a[j+1]=a[j];
j--; /*j--在这里的做用值得细心领会。j在外循环中处于抽出来的记录的前一个。这里,在有序区中找到比k大的则向右边挪动位置,j这时处于比k大的那个记录的前面一个了!*/
}
a[j+1]=k; /*这时a[j+1]是挪出的空位,把k插入,若是不比k小,则插在本身原来位置*/
}
for(l=0;l<=9;l++)
printf("%d\n",a[l]);
system("pause");
}it
引用地址:http://blog.programfan.com/trackback.asp?id=30329变量