随感而发

杂七杂八

统计

留言簿(13)

阅读排行榜

评论排行榜

插入排序

今天我学习的是插入排序,插入排序主要思想是:把要排序的数字插入到已经排好的数据中。(我自己理
解的哈)。例如12356是已经排好的序,我们将4插入到他们中,时插入之后也是排好序的。这里显而易见
是插入到3的后面。变为123456.
实现思路:插入排序就是先是一个有序的数据,然后把要插入的数据插到指定的位置,而排序首先给的就
是无序的,我们怎么确定先得到一个有序的数据呢?答案就是:如果只有一个,当然是有序的咯。我们先
拿一个出来,他是有序的,然后把数据一个一个插入到其中,那么插入之后是有序的,所以直到最后都是
有序的。。哈哈。结果就出来了!
当然在写的时候还是有一个技巧的,不需要开额外的数组,下标从第二个元素开始遍历知道最后一个,然
后插入到前面已经有序的数据中。这样就不会浪费空间了。插入排序用处还是很多的,特别是链表中,因
为链表是指针存放的,没有数组那么好准确的用下标表示,插入是简单有效的方法。嘻嘻。。废话少说,
源代码奉上:
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 //插入排序从下到大,nData为要排序的数据,nNum为数据的个数,该排序是稳定的排序
 5 bool InsertionSort(int nData[], int nNum)
 6 {
 7     for (int i = 1; i < nNum; ++i)        //遍历数组,进行插入排序
 8     {
 9         int nTemp = nData[i];
10         for (int j = 0; j < i; ++j)        //对该数,寻找他要插入的位置
11         {
12             if (nData[j] > nTemp)    //找到位置,然后插入该位置,之后的数据后移
13             {
14                 for (int k = i; k > j; --k)    //数据后移
15                 {
16                     nData[k] = nData[k -1];
17                 }
18                 nData[j] = nTemp;        //将数据插入到指定位置
19                 break;
20             }
21         }
22     }
23 
24     return true;
25 }
26 
27 int main()
28 {
29     int nData[10= {4,10,9,8,7,6,5,4,3,2};    //创建10个数据,测试
30     InsertionSort(nData, 10);        //调用插入排序
31 
32     for (int i = 0; i < 10++i)        
33     {
34         printf("%d ", nData[i]);
35     }
36 
37     printf("\n");
38     system("puase");
39     return 0;
40 }


posted on 2009-03-31 10:25 shongbee2 阅读(12303) 评论(8)  编辑 收藏 引用 所属分类: 数据结构和算法

评论

# re: 插入排序 2009-11-05 10:13 yujunfei_xy

为什么您要先找到该位置,然后才把其他数据后移呢?
因为前面的部分已经排好序,您若先把所有大于nTemp的数据后移,直到无数可移的时候,这个位置就是您要找的位置了,如此,就不用多做功了(数据后移与寻找位置是同时进行的)。
您可以参考一下别的代码……  回复  更多评论   

# re: 插入排序 2010-06-28 20:41 kaira

循环太多  回复  更多评论   

# re: 插入排序 2010-06-28 20:48 kaira

void Insert_sort(int n)
{
int i,j;
for(i=2;i<=n;i++)
if(R[i]<R[i-1])
{
R[0]=R[i];j=i-1;
do{
R[j+1]=R[j];
j--;

}while(R[0]<R[l]);
R[j+1]=R[0];
}
}
感觉比你的药好  回复  更多评论   

# re: 插入排序 2010-06-28 20:49 kaira

void Insert_sort(int n)
{
int i,j;
for(i=2;i<=n;i++)
if(R[i]<R[i-1])
{
R[0]=R[i];j=i-1;
do{
R[j+1]=R[j];
j--;

}while(R[0]<R[J]);
R[j+1]=R[0];
}
}   回复  更多评论   

# re: 插入排序[未登录] 2011-02-21 15:10 Randy

可以把循环合并一下。
int insertsort(int* idata, int len)
{
for (int i=1; i<len; ++i)
{
for (int j=i; j>0 && idata[j-1]>idata[j]; --j)
{
int temp = idata[j];
idata[j] = idata[j-1];
idata[j-1] = temp;
}
}
return 0;
}  回复  更多评论   

# re: 插入排序 2011-05-17 12:49 guo

@kaira
你这个程序也有问题。当j的值为0时,移位应该结束。所以还应该加上边界判断。
我修改了下,您看怎么样?
for (i = 1;i<nNum;i++)
{
if (nData[i] < nData[i-1])
{
temp = nData[i];
for (j = i-1; j>=0; j--)
{
if (temp < nData[j])
nData[j+1] = nData[j];
else
break;
}
nData[j+1] = temp; //插入数据

}

}  回复  更多评论   

# re: 插入排序 2012-03-16 00:12 冯燕辉

/**
* 直接插入排序属于稳定的排序,此函数为升序排序
* 时间复杂性为o(n^2),空间复杂度为O(1)
* @param array 待排序数组
* @param n 数组元素个数
*/
void insertion_sort(int array[], int n)
{
for(int i = 1; i < n; ++i)
{
int j;
int key = array[i];
for(j = i - 1; j >= 0 &&
array[j] > key; //升序
//array[j] > key; //降序
--j)
array[j+1] = array[j];
array[j+1] = key;
}
}  回复  更多评论   

# re: 插入排序[未登录] 2013-09-17 11:02 dd

int InsertionSort(int list[], int n)
{
int i , j;
int next;
for (i = 1; i < n; i ++){
next = list[i];
for(j = i-1; j >=0 && next < list[j] ;j--){
list[j+1] = list[j];
}
list[j+1] = next;
}
}  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理