插入排序-参考MoreWindows

来源:互联网 发布:access 导入excel sql 编辑:程序博客网 时间:2024/06/06 07:08

1插入排序与平时打牌一样,打牌的时候右手起到牌后,往左手的的有序的牌插入,插入排序也是一样的。比如有n个节点。a[0]---a[i-1]节点有序,把a[i]个节点插入到有序节点中。在这个过程中有两个关键:1找出 第a[i]节点在a[0]---a[i-1]中的位置。2把位置之后的元素后移一个位置,空出个坑,以便a[i]插入。

关键点一找位置用一个for循环即可。关键点二也用一个for循环。

代码1:找位置:

关键二是 元素后移:


总体代码:

#include <iostream>using namespace std;void InsertSortOperation(int a[],int n){int i,j;for ( i=1;i<n;i++){for ( j=i-1;j>=0;j--){if (a[j]<a[i])break;} //位置找到 插入位置为 j+1位置if (j!=i-1) //当j发生变化的时候,需要移动元素  //写上效率会高一点点,也符合思考的逻辑{int k;int tmp=a[i];for(k=i-1;k>j;k--){a[k+1]=a[k];}a[k+1]=tmp;}}}void main(){int a[]={4,3,7,5,9,1,2,17,23,11}; InsertSortOperation(a,10);for (int i=0;i<10;i++){cout << a[i] <<" ";}}

2将搜索和后移两部合在一起,将temp=a[i],j=i-1;  while(a[j]>a[i])  j--  a[j+1]=a[j]

void InsertSortOperation(int a[],int n){int i,j;for ( i=1;i<n;i++){int temp=a[i];if (a[i-1]>a[i]) // if(a[i-1]<a[i]) 无须调整{j=i-1;while (j>=0&&a[j]>temp){a[j+1]=a[j];j--;}a[j+1]=temp;}}}

或者用两个for循环:两个的思想是一样的。令j=i-1,temp=a[i] 一遍将数据后移,一边向前搜索。当有数据a[j]<a[i]时停止并将temp放到a[j+1]处

void InsertSortOperation(int a[],int n){int i,j;for ( i=1;i<n;i++){if (a[i-1]>a[i])  //有这个条件更符合逻辑 if(a[i-1]<a[i])的时候,就不用费神比较移动了{int temp=a[i];for (j=i-1;j>=0&&a[j]>temp;j--){a[j+1]=a[j];}a[j+1]=temp;}}}


3用数据交换代替元素移动,

void InsertSortOperation(int a[],int n){int i,j;for ( i=1;i<n;i++){for (j=i-1;j>=0&&a[j]>a[j+1];j--)//a[j]>a[j+1] 相邻两元素比较swap(a[j+1],a[j]);}}


0 0
原创粉丝点击