排序问题——直接插入排序

1、插入排序的基本思想:在一个已经排好的记录子集的基础上,每一步将下一个待排序的记录有序插入到已排好的记录子集中,直到将所有待排记录全部插入为止。例如,打扑克牌时的抓牌就是一个很好的例子,每抓一张牌,插入到合适的位置,直到抓完牌为止,即可得到一个有序的序列。

2、直接插入排序的算法思想:其基本思想是:把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列。

插入排序:时间复杂度O(n^2)


直接插入排序是属于In-place sort(不占用额外内存或占用常数的内存),所以空间复杂度为O(1)。上一篇的冒泡排序同样如此


In-place sort的优点在于,当需要大量数据排序时,占用内存非常少。


步骤大概是这样的:


1.从第一个元素开始,该元素可以认为已经被排序          代码中   key = arr[i];就是这个意思 
2.取出下一个元素,在已经排序的元素序列中从后向前扫描
3.如果该元素(已排序)大于新元素,将该元素移到下一位置
4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5.将新元素插入到该位置后
6.重复步骤2~5

C描述:

#include <iostream>
 2 
 3 using namespace std;
 4 
 6 //// 写法1
 7 void insertSort_0(int arr[], int length)
 8 {
 9     int i, j, key;
10     for (i = 0; i < length; i++){
11         key = arr[i];
12         for (j = i - 1; j >= 0; j--){
13             if (arr[j] > key) {
14                 arr[j + 1] = arr[j];
15             }
16             else
17                 break;
18         }
19         arr[j + 1] = key;
20     }
21 }
22 
23 //// 写法2
24 void insertSort_1(int arr[], int length)
25 {
26     int j, key;
27     for (int i = 1; i < length; i++){
28         key = arr[i];
29         j = i - 1;
30         while (j >= 0 && arr[j] > key){
31             arr[j + 1] = arr[j];
32             j--;
33         }
34         arr[j + 1] = key;
35     }
36 }
37 
38 
39 
40 int main()
41 {
42     int iArr[] = { 7, 8, 9, 5, 2, 0, 12, 6 };
43     int len = sizeof iArr / sizeof(iArr[0]);
44 
45     cout << "排序前:";
46     for (int i = 0; i < len; i++)    {
47         cout <<  iArr[i] << " ";
48     }
49 
50     cout << "\n排序后:";
51     insertSort_0(iArr, len);
52     for (int j = 0; j < len; j++)    {
53         cout << iArr[j] << " ";
54     }
55     cout << endl;
56 
57     system("pause");
58     return 0;
59 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值