算法导论-插入排序
2014-02-26 11:16
218 查看
算法导论中的第一章是算法入门,开头的一个例子是关于插入排序的。
插入排序的过程:
将一个数组分成有序部分和无序部分(刚刚开始有序部分为第一个元素),然后将无序部分的第一个元素与有序部分的元素从前往后比较(也可以从后往前),符合要求时将这个元素插入数组中,当然了,有序部分的一些元素需要依次往后移一个,以便腾出位置插入。
例如一个数组:3 ,6,9,10,2,7 (按升序)
1. 一开始3是有序部分,比较6与3,符合,所以3,6已经排好序,称为了有序部分。
2. 同理经比较9,10也排好序了,3,6,9,10是有序部分。
3. 2与3比较,2小于3,那么3,6,9,10依次往后移一个位置,将2插入原来3的位置。2,3,6,9,10为有序部分。
4. 将7分别于2,3,6,9比较,当与9比较时发现9大于7,那么9,10依次往后移一个,将7插入原来9的位置。
自己写的c++代码实现:
/*=======================================
*Author: Fang Jie
*Date: 2014-2-26
*Function: InsertionSort
*Parameter: a[]为无序数组,NUM为数组个数
*Description: 按升序进行插入排序
=========================================*/
void InsertionSort(int a[], int NUM)
{
for (int i = 1; i < NUM; i++){ //从第二个数据开始
for (int j = 0; j < i; j++){
if (a[j] > a[i]){ //找到要插入的位置
int temp = a[i];
for (int k = i; k > j; k--){ //将插入位置后的元素往后移
a[k] = a[k - 1];
}
a[j] = temp; //插入元素
}
}
}
}
然后从网上参考了一下其他人的例子,可以进行部分该进。
/*=======================================
*Author: Fang Jie
*Date: 2014-2-26
*Function: InsertionSort
*Parameter: a[]为无序数组,NUM为数组个数
*Description: 按升序进行插入排序
=========================================*/
void InsertionSort(int a[], int NUM)
{
for (int i = 1; i < NUM; i++){ //从第二个数据开始
int j = 0;
while (j < i && a[j] <= a[i]) //找到要插入的位置
j++;
if (j < i){
int k = i;
int temp = a[i];
while (k > j){ //挪动位置
a[k] = a[k - 1];
k--;
}
a[k] = temp; //插入元素
}
}
}
主要是将while代替了for循环。
让我们来看看for,while,do-while各在什么时候使用
计数控制的循环用for语句表达;事件控制的循环则用while或do-while语句实现。其中,如果循环体至少要执行一次,则用do-while。
显然这里找位置和挪动位置宜使用while。
插入排序算法分析:
平均时间复杂度:O(n2)
空间复杂度: O(1)
刚才我们是从前向后插入,现在实现从后向前插入,这时我们可以比较一个移一个,不用找到了位置再移,可以看见代码变得少了。
/*=======================================
*Author: Fang Jie
*Date: 2014-2-26
*Function: InsertionSort
*Parameter: a[]为无序数组,NUM为数组个数
*Description: 按升序进行插入排序
=========================================*/
void InsertionSort(int a[], int NUM)
{
for (int i = 1; i < NUM; i++){ //从第二个数据开始
int j = i - 1;
int temp = a[i];
while (j >= 0 && a[j] > a[i]){ //从后向前
a[j + 1] = a[j]; //挪动
j--;
}
if (j != i - 1)
a[j + 1] = temp; //插入数据
}
}
当然,当数组个数很大时,假设还是使用插入排序,在查找插入位置时可以使用二分查找,提高速度。
插入排序的过程:
将一个数组分成有序部分和无序部分(刚刚开始有序部分为第一个元素),然后将无序部分的第一个元素与有序部分的元素从前往后比较(也可以从后往前),符合要求时将这个元素插入数组中,当然了,有序部分的一些元素需要依次往后移一个,以便腾出位置插入。
例如一个数组:3 ,6,9,10,2,7 (按升序)
1. 一开始3是有序部分,比较6与3,符合,所以3,6已经排好序,称为了有序部分。
2. 同理经比较9,10也排好序了,3,6,9,10是有序部分。
3. 2与3比较,2小于3,那么3,6,9,10依次往后移一个位置,将2插入原来3的位置。2,3,6,9,10为有序部分。
4. 将7分别于2,3,6,9比较,当与9比较时发现9大于7,那么9,10依次往后移一个,将7插入原来9的位置。
自己写的c++代码实现:
/*=======================================
*Author: Fang Jie
*Date: 2014-2-26
*Function: InsertionSort
*Parameter: a[]为无序数组,NUM为数组个数
*Description: 按升序进行插入排序
=========================================*/
void InsertionSort(int a[], int NUM)
{
for (int i = 1; i < NUM; i++){ //从第二个数据开始
for (int j = 0; j < i; j++){
if (a[j] > a[i]){ //找到要插入的位置
int temp = a[i];
for (int k = i; k > j; k--){ //将插入位置后的元素往后移
a[k] = a[k - 1];
}
a[j] = temp; //插入元素
}
}
}
}
然后从网上参考了一下其他人的例子,可以进行部分该进。
/*=======================================
*Author: Fang Jie
*Date: 2014-2-26
*Function: InsertionSort
*Parameter: a[]为无序数组,NUM为数组个数
*Description: 按升序进行插入排序
=========================================*/
void InsertionSort(int a[], int NUM)
{
for (int i = 1; i < NUM; i++){ //从第二个数据开始
int j = 0;
while (j < i && a[j] <= a[i]) //找到要插入的位置
j++;
if (j < i){
int k = i;
int temp = a[i];
while (k > j){ //挪动位置
a[k] = a[k - 1];
k--;
}
a[k] = temp; //插入元素
}
}
}
主要是将while代替了for循环。
让我们来看看for,while,do-while各在什么时候使用
计数控制的循环用for语句表达;事件控制的循环则用while或do-while语句实现。其中,如果循环体至少要执行一次,则用do-while。
显然这里找位置和挪动位置宜使用while。
插入排序算法分析:
平均时间复杂度:O(n2)
空间复杂度: O(1)
刚才我们是从前向后插入,现在实现从后向前插入,这时我们可以比较一个移一个,不用找到了位置再移,可以看见代码变得少了。
/*=======================================
*Author: Fang Jie
*Date: 2014-2-26
*Function: InsertionSort
*Parameter: a[]为无序数组,NUM为数组个数
*Description: 按升序进行插入排序
=========================================*/
void InsertionSort(int a[], int NUM)
{
for (int i = 1; i < NUM; i++){ //从第二个数据开始
int j = i - 1;
int temp = a[i];
while (j >= 0 && a[j] > a[i]){ //从后向前
a[j + 1] = a[j]; //挪动
j--;
}
if (j != i - 1)
a[j + 1] = temp; //插入数据
}
}
当然,当数组个数很大时,假设还是使用插入排序,在查找插入位置时可以使用二分查找,提高速度。
相关文章推荐
- 《算法导论》学习笔记:2.1 插入排序
- 学习《算法导论》第一章 插入排序 总结
- 算法导论-插入排序,归并排序,快速排序总结
- 算法导论笔记——插入排序
- 《算法导论》CLRS算法C++实现(一)P11 插入排序
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- 算法导论——插入排序
- 递归实现插入排序,算法导论练习2.3,linux C实现
- 算法导论(Introduction to Algorithms )— 第二章 算法入门 — 2.1 插入排序
- 算法导论--python--插入排序
- 《算法导论》读书笔记(一)——插入排序与循环不变式
- 算法导论(一)2、算法基础-插入排序 java
- 算法导论2.1——插入排序
- 《算法导论的Java实现》 1_1.1 插入排序
- 算法导论学习笔记(一)排序算法之插入排序
- 算法导论2.1-insertsort算法(插入排序)
- 温习《算法导论》的插入排序
- 算法导论程序1--插入排序(Python+Java)
- 算法导论 2.1-2 插入排序 (非递增)
- 《算法导论》学习笔记——插入排序