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 


原创粉丝点击