c++ 直接插入排序算法---数组引用调用,正序,倒序循环,for终止条件还是for可以条件
2012-11-21 16:47
585 查看
直接插入排序算法:
1.传入数组a给排序函数时候,实际上传入的是数组的第一个位置a[0]的地址,因此实际上是引用调用,所以可以修改原来的数组。
2.插入排序每个数都和他前面的数进行比较,先比较他前面的第一个 第二个。。。如果他比前面的数小,就把那个前面的数像后移动一位,这样每次发现一个小的都向后移动一位,最后把这个数插入到最后移动的那个数地方。
3.我原来的思路是正向从已经排序好的数进行查找,这样的好处是只要找到一个比他大的就ok了,后面肯定比他大,然后把后面的数向后移动把他插入到这个比他大的数的位置。不好的地方就是,移动数据比较麻烦。
错:正向后移动的话 后面的数据全部被覆盖了。
4.如3说的正向比较只要找到第一个大的就ok了,减少了比较的次数,(移动次数还是那么多),当把检验条件
移动到for里面为什就错了呢,因为for的终止条件是and,[b]当for (j = 0;j<i&&temp < a[j]; j++) 如果正向找的的我们加入第一个数a[0]不大于temp 及 temp
< a[j] 为假了 那么就不能继续找下一个了,往往是第一个不容易满足后面的有可能有的,但是这个for循环不再继续了。[/b]
[b]那么为什么人家倒着找就没有问题呢?因为倒着找temp比a[j]小的,什么时候找到不合适的才停止,先遇到的都是大的,都是合适的,正好不合适停止就是那个位置。[/b]
这次错误是因为 &&这个条件倒序找正好是不合适的时候才停,规律是 true,[b] true,[b] true当false时候停退出for循环。[/b][/b]
[b][b]正着找应该是挨个找最大的改成temp>a[j]为终止条件就好了,temp<a[j]应该是继续执行的条件要找的条件所以放在for循环体里面 用break跳出。[/b][/b]
修改为倒向移动:
仍然不对因为我原来设想的是:如果碰到小的那个就不用比了,得到这个小的数的位置j,因此如果要用for循环的话,把后面的移动放到for里面去,不然会造成找到的那个数不是最小的实际上是比他小的中最大的一个,因此放到for里面而且一定要,找到这个小的就跳出这个for循环。
上面的for运行的判断条件改成for里面的用if判断
1.传入数组a给排序函数时候,实际上传入的是数组的第一个位置a[0]的地址,因此实际上是引用调用,所以可以修改原来的数组。
2.插入排序每个数都和他前面的数进行比较,先比较他前面的第一个 第二个。。。如果他比前面的数小,就把那个前面的数像后移动一位,这样每次发现一个小的都向后移动一位,最后把这个数插入到最后移动的那个数地方。
3.我原来的思路是正向从已经排序好的数进行查找,这样的好处是只要找到一个比他大的就ok了,后面肯定比他大,然后把后面的数向后移动把他插入到这个比他大的数的位置。不好的地方就是,移动数据比较麻烦。
错:正向后移动的话 后面的数据全部被覆盖了。
4.如3说的正向比较只要找到第一个大的就ok了,减少了比较的次数,(移动次数还是那么多),当把检验条件
移动到for里面为什就错了呢,因为for的终止条件是and,[b]当for (j = 0;j<i&&temp < a[j]; j++) 如果正向找的的我们加入第一个数a[0]不大于temp 及 temp
< a[j] 为假了 那么就不能继续找下一个了,往往是第一个不容易满足后面的有可能有的,但是这个for循环不再继续了。[/b]
[b]那么为什么人家倒着找就没有问题呢?因为倒着找temp比a[j]小的,什么时候找到不合适的才停止,先遇到的都是大的,都是合适的,正好不合适停止就是那个位置。[/b]
这次错误是因为 &&这个条件倒序找正好是不合适的时候才停,规律是 true,[b] true,[b] true当false时候停退出for循环。[/b][/b]
[b][b]正着找应该是挨个找最大的改成temp>a[j]为终止条件就好了,temp<a[j]应该是继续执行的条件要找的条件所以放在for循环体里面 用break跳出。[/b][/b]
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
相关文章推荐
- Lesson_for_java_day07--java中数组的定义及常见排序方法--冒泡法、简单选择法、直接插入法和调用方法排序
- C++中构造函数居然是可以直接调用的
- 一个数组的倒序----管他Java还是c还是c++还是其他
- 使用递归函数,将一个整型数组倒序输出。(数组用了随机数,每次的数组都不同,只用了调用,遗憾没用递归。。可以把for循环换成递归)
- JNI进阶二(C++调用java数组 和 JNI引用)
- c++中为什么父类名可以直接调用自己的非静态函数测试例子!(父类名::非静态函数)
- 嵌套的for循环执行顺序。可以让内外for循环交替执行。简单解析json数组。求js中两个时间差值。
- C++ 引用调用和引用返回可以大大增加程序运行效率
- 关于动态存储分配函数的调用,在已经过排序的数组中查找及删除内容的操作,余数的分析,删除字符数组中的空格,对链表的逆置,在源字符串中查找子字符串的个数,函数指针以及函数的调用,循环赋值带来的问题以及插入
- 数组倒序文件,用时可以直接用
- JavaScript-//FOR/IN循环。当使用for/in循环遍历关联数组时,就可以清晰地体会到for/in的强大之处。
- 【C语言基础】写代码可以在整型有序数组中查找想要的数字(while循环,if条件语句)
- C#调用c++的dll,结构体数组作为引用参数的传递方式
- c++的for循环居然可以精简成这样!
- C++实现常用排序算法(快速排序、冒泡排序、希尔排序、折半插入排序、直接插入排序)
- Win32关于GDI 的API (Win32的API函数是微软自己的东西,可以直接在C#中直接调用,在做WinForm时还是很有帮助的。有时候我们之直接调用Win32 的API,可以很高效的实现想要)
- 【C++】C++的输入输出、循环、条件、字符串、数组、类、继承的使用实例
- C++中利用for和while循环条件语句求两个数的和
- c++不能建立引用数组,可以建立数组的引用
- 做的一些测试数据的分析 一个是直接循环插入数据库 一个是循环好了放在数组里 在插入数据库