直接排序插入排序 和插入排序有什么区别??

经典排序算法 & 插入排序Insertion sort& 插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
插入排序方法分直接插入排序和折半插入排序两种,这里只介绍直接插入排序,折半插入排序留到&查找&内容中进行。
& 图1演示了对4个元素进行直接插入排序的过程,共需要(a),(b),(c)三次插入。
以下代码仅供参考,欢迎指正
/// &summary&
/// 插入排序
/// &/summary&
/// &param name="unsorted"&&/param&
static void insertion_sort(int[] unsorted)
for (int i = 1; i & unsorted.L i++)
if (unsorted[i - 1] & unsorted[i])
int temp = unsorted[i];
while (j & 0 && unsorted[j - 1] & temp)
unsorted[j] = unsorted[j - 1];
unsorted[j] =
static void Main(string[] args)
int[] x = { 6, 2, 4, 1, 5, 9 };
insertion_sort(x);
foreach (var item in x)
if (item & 0)
Console.WriteLine(item + ",");
Console.ReadLine();
阅读(...) 评论()trackbacks-0
直接插入排序的基本方法:每步将一个待排序的元素,按其排序码的大小,插入到前面已经排好序的一组元素的适当位置上去,直到元素全部插入为止。
插入排序(insert sorting)思想:当插入第i个元素时,前面的v[0],v[1],v[2]......v[i-1],已经排好序了.这时用v[i]的插入码与v[i-1],v[i-2],......排序码进行比较,找到插入的位置即插入v[i],原来位置上的元素从后向前依次后移。
时间复杂度: &平均比较次数O(n2),平均移动次数&O(n2).
直接插入排序是一种稳定的排序。元素大部分有序时效率会更高,这时比较次数和移动次数都会减少。
参考代码: 
void Sort&T&::insertSort(DataList&T& &datalist, int n){   if ( -1 == n)   {     for (int i = 1; i & datalist.m_nCurrentS i++)     {       insertSort(datalist, i);     }        }   Element&T& temp = datalist.m_pvector[n];      for ( j = j & 0; j--)   {     if (temp & datalist.m_pvector[j-1])     {            }else     {       datalist.m_pvector[j] = datalist.m_pvector[j-1];     }   }   datalist.m_pvector[j] =}
二分(折半)插入(Binary insert sort)排序基本思想:设在数据表中有一个元素序列v[0],v[1],v[2]......v[n].其中v[0],v[1],v[2]......v[i-1]是已经排好序的元素。在插入v[i]。利用折半搜索寻找v[i]的插入位置。
二分插入排序是一种稳定的排序。当n较大时,总排序码比较次数比直接插入排序的最差情况好得多,但比最好情况要差,所元素初始序列已经按排序码接近有序时,直接插入排序比二分插入排序比较次数少。二分插入排序元素移动次数与直接插入排序相同,依赖于元素初始序列。
参考代码:
template &class T&void Sort&T&::binaryInsert(DataList&T& &datalist, int n){   if (-1 == n)   {     for (int i = 1; i & datalist.m_nCurrentS i++)     {       binaryInsert(datalist, i);     }        }   Element&T& temp = datalist.m_pvector[n];   int left = 0, right = n - 1;     while(left &= right)   {     int middle = (left + right) / 2;     if (temp & datalist.m_pvector[middle])     {       left = middle + 1;     }else     {       right = middle - 1;     }   }   for (int j = n - 1; j &= j--)   {     datalist.m_pvector[j+1] = datalist.m_pvector[j];   }   datalist.m_pvector[left] =}
希尔排序(Shell sort)基本思想: 改进的直接插入算法。设待排序的元素序列有n个元素,首先取一整数gap(&n)作为间隔,将全部元素分为gap个子序列,所有距离为gap的元素放在同一序列中,在每个子序列中分别进行直接插入排序。然后缩小gap,例如gap=gap/2,重复上述的子序列划分与排序工作。开始由于gap取直大,每个子序列元素少,排序速度快,待排序后期,gap值逐渐变小,子序列元素变多,但由于前面的工作基础,大多数元素已经有序,所以排序速度快。
希尔排序是一种不稳定的排序。
参考代码:
void swap(int *a, int *b){      x = *a;   *a = *b;   *b =}
void insertion_sort(int data[], int n, int increment){     int i,   for (i = i & i += increment)   {     for (j = j &= increment && data[j] & data[j-increment]; j -= increment)     {       swap(&data[j], &data[j-increment]);
    }   }}
void shellsort(int data[], int n){   int i,   for (i = n / 2; i & 0; i /= 2)   {     for (j = 0; j & j++)     {       insertion_sort(data, n, i);     }   }}
另一种参考代码:
template &class T&void Sort&T&::shellSort(DataList&T& &datalist, int gap /* = -1 */){   if (-1 == gap)   {     int gap = datalist.m_nCurrentSize / 2;     while(gap)     {       shellSort(datalist, gap);       gap = gap / 2;     }        }   for (int i = i & datalist.m_nCurrentS i++)   {     insert(datalist, i, gap);   }}
template &class T&void Sort&T&::insert(DataList&T& &dataList, int n, int gap){ for (int i = i &= i -= gap) { if (dataList.m_pvector[i] & dataList.m_pvector[i-gap]) { Element&T& temp = dataList.m_pvector[i]; dataList.m_pvector[i] = dataList.m_pvector[i-1]; dataList.m_pvector[i-1] = } }}
总结:以上三种排序方法的核心都是直接插入排序,直接插入排序对于大部分有序的序列排序时速度快。二分插入排序在直接插入的基本上改变了查找元素插入位置的方法,对于完全无序的序列来说,速度会变快,但是对开大部分有序的序列反而会更慢,希尔排序则利用直接插入排序对于大部分有序的序列速度快的特点,先让大部分序列有序,以此来提高排序效率。
阅读(...) 评论()以下关于排序的说法中,正确的是A.排序就是将数按从小到大的顺序排序B.排序只有两种方法,即直接插入排序和冒泡排序C.用冒泡排序把一列数从小到大排序时,最小的数逐趟向上漂浮D.用冒泡_作业帮
拍照搜题,秒出答案
以下关于排序的说法中,正确的是A.排序就是将数按从小到大的顺序排序B.排序只有两种方法,即直接插入排序和冒泡排序C.用冒泡排序把一列数从小到大排序时,最小的数逐趟向上漂浮D.用冒泡
以下关于排序的说法中,正确的是A.排序就是将数按从小到大的顺序排序B.排序只有两种方法,即直接插入排序和冒泡排序C.用冒泡排序把一列数从小到大排序时,最小的数逐趟向上漂浮D.用冒泡排序把一列数从小到大排序时,最大的数逐趟向上漂浮
答案C分析:根据冒泡排序法:对尚未排序的各元素从头到尾依次比较相邻的两个元素是否逆序(与欲排顺序相反),若逆序就交换这两元素,经过第一轮比较排序后便可把最大(或最小)的元素排好,然后再用同样的方法把剩下的元素逐个进行比较,就得到了你所要的顺序.可以看出如果有 n 个元素,那么一共要进行 n-1 轮比较,第 i 轮要进行 j=n-i 次比较.即可选出答案.根据冒泡排序法可知:用冒泡排序把一列数从小到大排序时,最小的数逐趟向上漂浮.故选C.点评:理解冒泡排序法是解题的关键.插入排序、选择排序和冒泡排序的区别
[问题点数:20分,结帖人c237878]
插入排序、选择排序和冒泡排序的区别
[问题点数:20分,结帖人c237878]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2011年9月 C/C++大版内专家分月排行榜第二2011年4月 C/C++大版内专家分月排行榜第二2010年11月 C/C++大版内专家分月排行榜第二
2011年6月 C/C++大版内专家分月排行榜第三
2012年1月 其他开发语言大版内专家分月排行榜第二2011年5月 其他开发语言大版内专家分月排行榜第二2010年12月 其他开发语言大版内专家分月排行榜第二2009年2月 其他开发语言大版内专家分月排行榜第二2008年9月 其他开发语言大版内专家分月排行榜第二2008年8月 其他开发语言大版内专家分月排行榜第二2008年5月 其他开发语言大版内专家分月排行榜第二2007年11月 其他开发语言大版内专家分月排行榜第二
2011年4月 其他开发语言大版内专家分月排行榜第三2011年1月 其他开发语言大版内专家分月排行榜第三2009年6月 其他开发语言大版内专家分月排行榜第三2009年4月 其他开发语言大版内专家分月排行榜第三2009年1月 其他开发语言大版内专家分月排行榜第三2008年11月 其他开发语言大版内专家分月排行榜第三2008年7月 其他开发语言大版内专家分月排行榜第三2008年6月 其他开发语言大版内专家分月排行榜第三2006年9月 其他开发语言大版内专家分月排行榜第三
2010年12月 C/C++大版内专家分月排行榜第三
2011年8月 C/C++大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。14.插入排序与选择排序_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
文档贡献者
评价文档:
14.插入排序与选择排序
排​序​的​基​本​概​念​
​
​直​接​插​入​排​序​
​
​直​接​选​择​排​序
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
大小:820.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢

我要回帖

更多关于 直接排序 的文章

 

随机推荐