直接插入排序
来源:互联网 发布:windows确认证书 编辑:程序博客网 时间:2024/06/07 14:50
直接插入排序
直接插入排序是逐次将第i-1个元素到第0元素和第i个元素比较,若当前元素大(小)于第i个元素,当前元素向后移位,否则,退出循环,并且当前元素等于第i个元素。
可参考百度百科直接插入排序:http://baike.baidu.com/item/%E7%9B%B4%E6%8E%A5%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F?sefr=cr
c代码如下:
void InsertSort (int * const pia, const int n){ int i; int j; int temp; for (i=1; i<n; i++) { temp = pia[i]; for (j=i; j>0 && pia[j-1]>temp; j--) pia[j] = pia[j-1]; pia[j] = temp; }}
i和j取值:
第0个元素一开始是有序的,因此i从第1个元素开始直至第n-1个元素,即i<n;
j的元素取值是从i-1开始直至0,按正常理解写法如下。
void InsertSort (int * const pia, const int n){ int i; int j; int temp; for (i=1; i<n; i++) { temp = pia[i]; for (j=i-1; j>=0 && pia[j]>temp; j--) pia[j+1] = pia[j]; pia[j+1] = temp; }}
j必须取到0元素。
当不满足条件时,当前元素的上一个元素位置是空的,将i元素填入。<-----正常理解写法
当不满足条件时,当前元素(因为内循环比较的是当前元素的下一个元素,即j-1)的位置是空的,将i元素填入。<-----本文所用c写法
由于i前面的元素已经是有序的,因此在查找插入位置时,也有采用二分查找,但必须是右闭区间,否则,排序将不稳定。
在查找位置时,也有进行两两相邻交换的方法(有点类似冒泡的意思)。
完整c代码:
#include <stdio.h>#include <stdlib.h>#include<windows.h>void InsertSort (int * const pia, const int n){ int i; int j; int temp; for (i=1; i<n; i++) { temp = pia[i]; for (j=i; j>0 && pia[j-1]>temp; j--) pia[j] = pia[j-1]; pia[j] = temp; }}int testArray[] = {1,3,5,7,9,2,4,6,8,0};void PrintfIntArray (int * const pia, const int n){ int i; for (i=0; i<n; i++) printf("%u ", pia[i]); printf("\n");}int main(){ DWORD startTime; DWORD endTime; printf("Hello world!\n"); startTime = GetTickCount (); InsertSort (testArray, sizeof(testArray)/sizeof(int)); endTime = GetTickCount(); printf ("Sort Time Consumption:%lu ms.\n", endTime-startTime); PrintfIntArray (testArray, sizeof(testArray)/sizeof(int)); return 0;}
0 0
- 插入排序--直接插入
- 插入排序------直接插入
- 插入排序---直接插入
- 排序:直接插入排序
- 排序---直接插入排序
- 排序 -- 直接插入排序
- 排序---直接插入排序
- 排序--直接插入排序
- 排序-直接插入排序
- 【排序】直接插入排序
- 排序--直接插入排序
- 排序:直接插入排序
- 【排序】直接插入排序
- 排序--直接插入排序
- 排序--直接插入排序
- 排序-直接插入排序
- 插入排序--直接插入排序
- 插入排序-直接插入排序
- 【Java基础】Java分支结构
- Tomcata-Tomcat的系统安全管理
- 智能化将对企业产生四方面影响
- MySQL 1055错误
- Eclipse 打开Eclipse Marketplace报错:Cannot open Eclipse Marketplace
- 直接插入排序
- RMAN 备份与恢复深入解析1
- emplace_back() 和 push_back 的区别
- gradle安装
- 安卓漫漫路之startActivityForResult的使用.
- Android原生APP中添加ReactNative 进行混合开发教程
- 16.约束关系
- scp、ssh无密码使用
- 如何配置 tomcat