直接排序---终极指南
来源:百度文库 编辑:神马文学网 时间: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]);
}
基本的代码如下
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]);
}
直接排序---终极指南
网卡终极指南
《蛇类终极指南》
冒泡 直接插入 希尔排序 效率比拼
人像摄影终极POSE指南
数码相机夜景拍摄终极指南
人像摄影终极POSE指南
Perl直接入门详尽指南
Perl直接入门详尽指南
Perl直接入门详尽指南
Bitcomet下载终极优化指南adsl篇
数码相机终极指南!39条军规
Bitcomet下载终极优化指南adsl篇 --中关村在线二
Bitcomet下载终极优化指南adsl篇 --中关村在线三
从芯片入手 高清播放机选购终极指南
从芯片入手 高清播放机选购终极指南
高校BBS论坛网站站长实用指南终极完整版:域名选择和注册、服务器租赁等
数码 照 相机终极指南!39条军规之选购技巧
摄影终极指南:精准曝光和快速对焦技巧[上] - 摄影资讯 - 酷摄联盟
直接疯了:《三字经》翻成英文竟成了性指南
直接疯了:《三字经》翻成英文竟成了性指南
希尔排序
数据结构排序
饮食排序