c++ 直接插入排序算法---数组引用调用,正序,倒序循环,for终止条件还是for可以条件
来源:互联网 发布:淘宝一件代发发货地址 编辑:程序博客网 时间:2024/04/27 04:57
直接插入排序算法:
1.传入数组a给排序函数时候,实际上传入的是数组的第一个位置a[0]的地址,因此实际上是引用调用,所以可以修改原来的数组。
2.插入排序每个数都和他前面的数进行比较,先比较他前面的第一个 第二个。。。如果他比前面的数小,就把那个前面的数像后移动一位,这样每次发现一个小的都向后移动一位,最后把这个数插入到最后移动的那个数地方。
3.我原来的思路是正向从已经排序好的数进行查找,这样的好处是只要找到一个比他大的就ok了,后面肯定比他大,然后把后面的数向后移动把他插入到这个比他大的数的位置。不好的地方就是,移动数据比较麻烦。
错:正向后移动的话 后面的数据全部被覆盖了。
4.如3说的正向比较只要找到第一个大的就ok了,减少了比较的次数,(移动次数还是那么多),当把检验条件
移动到for里面为什就错了呢,因为for的终止条件是and,当for (j = 0;j<i&&temp < a[j]; j++) 如果正向找的的我们加入第一个数a[0]不大于temp 及 temp < a[j] 为假了 那么就不能继续找下一个了,往往是第一个不容易满足后面的有可能有的,但是这个for循环不再继续了。
那么为什么人家倒着找就没有问题呢?因为倒着找temp比a[j]小的,什么时候找到不合适的才停止,先遇到的都是大的,都是合适的,正好不合适停止就是那个位置。
这次错误是因为 &&这个条件倒序找正好是不合适的时候才停,规律是 true, true, true当false时候停退出for循环。
正着找应该是挨个找最大的改成temp>a[j]为终止条件就好了,temp<a[j]应该是继续执行的条件要找的条件所以放在for循环体里面 用break跳出。
void insert_sort2(int a[], int n){ int i, j,k, temp; for (i = 1; i < n; ++i) { temp = a[i]; //找到要替换的位置j-1 for (j = 0;j<i&&temp < a[j]; j++) //正向移动后面的数据全部被覆盖了 //倒着向后移动只会覆盖最后那个想要新插入的数,而且它已经赋值给temp了 for(k=j-1;k<i;k++){ array[k+1]=array[k]; } //把新插入的数插入正确的位置 array[j-1] = temp; } }//for
修改为倒向移动:
void insert_sort2(int a[], int n){ int i, j,k, temp; for (i = 1; i < n; ++i) { temp = a[i]; //找到要替换的位置j-1 for (j = 0;j<i&&temp < a[j]; j++){} //正向移动后面的数据全部被覆盖了 //倒着向后移动只会覆盖最后那个想要新插入的数,而且它已经赋值给temp了 for(k=i-1;k>=j-1;k--){ a[k+1]=a[k]; } //把新插入的数插入正确的位置 a[j-1] = temp; }//for for (i = 0; i < n; ++i){ cout<<a[i]<<" "<<endl; }}//insert
仍然不对因为我原来设想的是:如果碰到小的那个就不用比了,得到这个小的数的位置j,因此如果要用for循环的话,把后面的移动放到for里面去,不然会造成找到的那个数不是最小的实际上是比他小的中最大的一个,因此放到for里面而且一定要,找到这个小的就跳出这个for循环。
void insert_sort2(int a[], int n){ int i, j,k, temp; for (i = 1; i < n; ++i) { temp = a[i]; //找到要替换的位置j-1 for (j = 0;temp < a[j]&&j<i; j++) { //正向移动后面的数据全部被覆盖了 //倒着向后移动只会覆盖最后那个想要新插入的数,而且它已经赋值给temp了 for(k=i-1;k>=j;k--){a[k+1]=a[k]; } //把新插入的数插入正确的位置 a[j] = temp; break; } }//for for (i = 0; i < n; ++i){ cout<<a[i]<<" "<<endl; }}//
上面的for运行的判断条件改成for里面的用if判断
void insert_sort2(int a[], int n){ int i, j,k, temp; for (i = 1; i < n; ++i) { temp = a[i]; //找到要替换的位置j-1 for (j = 0;j<i; j++) { if(temp < a[j]){ //正向移动后面的数据全部被覆盖了 //倒着向后移动只会覆盖最后那个想要新插入的数,而且它已经赋值给temp了 for(k=i-1;k>=j;k--){a[k+1]=a[k]; } //把新插入的数插入正确的位置 a[j] = temp; break; } } }//for for (i = 0; i < n; ++i){ cout<<a[i]<<" "<<endl; }}//insert
#include<iostream>using namespace std;void insert_sort(int a[], int n); int main(){ int a[]={ 46, 58, 15, 45, 90, 18, 10, 62}; insert_sort(a,8); system("pause"); return 0;} void insert_sort(int a[], int n){ int i, j, temp; for (i = 1; i < n; ++i) { temp = a[i]; for (j = i; j>0 && temp < a[j - 1]; --j) { a[j] = a[j - 1]; } a[j] = temp; }//for for (i = 0; i < n; ++i){ cout<<a[i]<<" "<<endl; }}//insert
- c++ 直接插入排序算法---数组引用调用,正序,倒序循环,for终止条件还是for可以条件
- for循环,循环条件
- 希尔排序---for循环步长大于1时候的终止条件有问题
- 希尔排序---for循环步长大于1时候的终止条件有问题
- for (初始化语句; 判断条件; 循环条件)
- for循环的条件冗余
- python条件、循环、终止
- js for循环倒序输出数组元素
- C# for循环倒序输出数组元素
- C学习if条件判断和for循环
- c语言实现直接插入排序(正序和逆序)
- for(foo('A');foo('B')&&(i<2);foo('C')) ,其实考的就是for (初始化语句; 判断条件; 循环条件)
- 用函数作为for循环的条件
- for循环的判断条件应注意!
- for循环中的条件执行循序
- for(field f :fs) {} 循环条件是什么意思?
- 插入排序(正序、倒序)-c++代码实现
- 无限循环遍历数组(正序|倒序)先加后减原则
- weblogic配置 JDBC 多数据源
- Mac下配置Android NDK环境并搭建Cocos2d-x环境并Eclipse正常编译运行
- mfc ribbon中的按钮设置了子项后需添加一个空的响应函数才能使之able
- c语言面试题(3)
- 开始
- c++ 直接插入排序算法---数组引用调用,正序,倒序循环,for终止条件还是for可以条件
- servlet
- 回忆遗忘的js
- js 浮动div广告(对联广告)
- LINUX环境并发服务器的三种实现模型
- Linux命令大全,你想找的资料全在这儿了
- u-boot中uart调试口初始化代码
- vs2010中生成的工程文件哪些可以删除
- C#序列化成XML注意事项