直接排序---终极指南

来源:百度文库 编辑:神马文学网 时间:2024/04/28 21:38:13
关于直接排序算法:
基本的代码如下
for(i = 1; i < n; ++i) if(a[i]{
int temp = a[i];
for (j = i; j >= 0 && temp < a[j - 1]; --j)
{
a[j] = a[j - 1];
}
a[j] = temp;
}我的问题:
1.我不明白为什么在for (j = i; j >= 0 && temp < a[j - 1]; --j)
这一句执行完判断后为什么a[j] = a[j - 1]; 执行这一句赋值呢?这样岂不是把原来的覆盖掉了吗?为什么不使用一个中间值呢?
承蒙指点,不胜感激!!!
这个其实就是直接插入排序,首先从第二个元素开始,也就是你的赋值操作,把a[i]赋给temp,第一次其实就是a[2],让它和a[1]比较,如果比a[1]小的话,
那么就让a[2]等于a[1],让a[1]等于temp,这个temp其实就是刚开始保存的a[2].
这样的话 a[1]和a[2]就是有序的了。
   同样的道理,当依次往后面遇到每一个元素的时候,都让这个元素和前面的每一个元素进行比较,如果遇到了比它大的就往后面挪一步。举个例子来说
 比如 1,2,4,3.当遇到第四个数 也就是3的时候,就让它和前面的每一个数进行比较,3比4小吗,回答是小,那么久让第四个数等于4,这个时候3保存在temp变量中,让第三个书等于3,然后让temp=3和 2比较,比它大 ,所以不动,同样的道理和1比较,也不动。于是整个数组就有序了 1,2,3,4.
排序的方法有很多中,有选择排序,冒泡排序,快排等等,你写的这个是插入排序。它的原理其实很简单:从数组的第一个数(其实可以从第二个数开始)往它的前面遍历,只要我当前的数比数组中的数小,我就应该排在它的前面,而后面的数都应该往后移一位给我腾出一个位置,如此一遍循环下来数组的排序就完成了。
我们以下面的一列数组为例子来模拟一下它的过程:
10 4 5 9 8 7 2 1 6 3  //初始状态
4 10 5 9 8 7 2 1 6 3  //将4插到前面
4 5 10 9 8 7 2 1 6 3  //将5插到前面
4 5 9 10 8 7 2 1 6 3  //将9插到前面
4 5 8 9 10 7 2 1 6 3  //将8插到前面
4 5 7 8 9 10 2 1 6 3  //将7插到前面
2 4 5 7 8 9 10 1 6 3  //将2插到前面
1 2 4 5 7 8 9 10 6 3  //将1插到前面
1 2 4 5 6 7 8 9 10 3  //将6插到前面
1 2 3 4 5 6 7 8 9 10  //将3插到前面 排序完成
我想这样应该可以理解了,呵呵……
#include
 
int main()
{
 int i,j;
 int a[10];
 printf("please input 10 numbers\n");
 for(i=0;i<10;i++)
 scanf("%d",&a[i]);
 printf("采用直接排序法的结果如下:\n");
 for(i=1;i<10;i++)if(a[i] {
  int temp=a[i];
  for(j=i;j>=0&&temp  {
   a[j]=a[j-1];
  }
 a[j]=temp; }
 for(i=0;i<10;i++)
 printf("a[%d]=%d\n",i,a[i]);
 }