算法——直接插入和希尔排序
2012-01-05 10:38
197 查看
插入排序包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序)。
算法思想:假定这个数组的序是排好的,然后从头往后,如果有数比当前外层元素的值大,则将这个数的位置往后挪,直到当前外层元素的值大于或等于它前面的位置为止.这具算法在排完前k个数之后,可以保证a[1…k]是局部有序的,保证了插入过程的正确性.
1.直接插入
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
直接插入排序属于稳定的排序,时间复杂性为o(n^2),空间复杂度为O(1)。
C/C++代码实现直接插入排序:
2.希尔排序:
基本思想是:取一个间隔(gap),将序列分成若干的子序列,对每个子序列进行直插排序;然后逐渐缩小间隔,重复以上过程,直到间隔为1。不需要大量的辅助空间,和归并排序一样容易实现。希尔排序是基于插入排序的一种算法,在此算法基础之上增加了一个新的特性,提高了效率。希尔排序的时间复杂度为 O(N*(logN)2),
C/C++代码实现:
算法思想:假定这个数组的序是排好的,然后从头往后,如果有数比当前外层元素的值大,则将这个数的位置往后挪,直到当前外层元素的值大于或等于它前面的位置为止.这具算法在排完前k个数之后,可以保证a[1…k]是局部有序的,保证了插入过程的正确性.
1.直接插入
每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
直接插入排序属于稳定的排序,时间复杂性为o(n^2),空间复杂度为O(1)。
C/C++代码实现直接插入排序:
// 直接插入.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> using namespace std; void InsertSort(int *arr,int n) { int i,j; int temp; for(i=1;i<n;i++) { temp = arr[i];//将要比较的数存在temp中 for(j=i ; j>0 && temp < arr[j-1] ; j--)//将已排列的数组和要排列的数进行比较 { arr[j]=arr[j-1];// 所有大的数向右移动一位 } arr[j]=temp; } } int _tmain(int argc, _TCHAR* argv[]) { int arr[]={2,6,7,5,8,1,9,10,3,4}; int n=10; InsertSort(arr,10); for(int k=0;k<n;k++) cout<<arr[k]<<" "; int X; cin>>X; return 0; }
2.希尔排序:
基本思想是:取一个间隔(gap),将序列分成若干的子序列,对每个子序列进行直插排序;然后逐渐缩小间隔,重复以上过程,直到间隔为1。不需要大量的辅助空间,和归并排序一样容易实现。希尔排序是基于插入排序的一种算法,在此算法基础之上增加了一个新的特性,提高了效率。希尔排序的时间复杂度为 O(N*(logN)2),
C/C++代码实现:
// 希尔排序.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> using namespace std; void shell_Sort(int *arr,int n) { int h, j, k, t; for (h=n/2; h>0; h=h/2) /*控制增量*/ { for (j=h; j<n; j++) /*这个实际上就是上面的直接插入排序*/ { t = arr[j]; for (k=j-h; k>=0 && t<arr[k]; k-=h) { arr[k+h] = arr[k]; } arr[k+h] = t; } } } int _tmain(int argc, _TCHAR* argv[]) { int arr[]={2,6,7,5,8,1,9,10,3,4}; int n=10; shell_Sort(arr,10); for(int k=0;k<n;k++) cout<<arr[k]<<" "; int X; cin>>X; return 0; }
相关文章推荐
- 算法导论 第2章 算法入门(直接插入排序、希尔排序、冒泡排序、合并排序)
- 算法导论 第2章 算法入门(直接插入排序、希尔排序、冒泡排序、合并排序)
- 【算法拾遗(java描写叙述)】--- 插入排序(直接插入排序、希尔排序)
- 直接插入排序与希尔排序的思想及算法实现
- 算法系列-直接插入排序和希尔排序
- 算法之直接插入排序和希尔排序
- 【算法拾遗(java描述)】--- 插入排序(直接插入排序、希尔排序)
- 算法 -- iOS开发用Objective_C / Swift3.0实现:直接插入排序 / 二分法插入排序 / 希尔排序
- 算法-排序-插入排序(直接插入和希尔排序)
- 插入排序算法之直接插入排序和希尔排序
- 数据结构与算法——插入类排序(直接插入排序,希尔排序)
- java实现排序算法之插入排序(直接插入排序,折半插入排序,希尔排序)
- 算法笔记--直接插入排序
- 第16周项目1-验证算法(1)直接插入排序
- 算法不会,尚能饭否之排序——直接插入排序(Insert sort)
- 项目1 验证算法(1) 直接插入排序
- 【算法系列】排序算法(2)直接插入排序
- 数据结构与算法---直接插入排序
- 算法六之直接插入排序
- 白话经典算法系列之二 直接插入排序的三种实现