基本排序算法(1)—插入排序及其变形shell排序
2012-11-29 10:19
302 查看
简略地讲,排序问题是指对输入的一个序列(a1,a2,a3......an),按照升序或者降序输出其中的元素或返回排序好后的序列。
第一次当然是经典的插入排序,这个几乎是每一个接触排序的程序猿看到的第一个排序算法了吧。
插入排序的原理非常简单,并且当问题规模较小或者基本有序时效率很高。按照《Introduction to Algorithms》的说法,插入排序的工作机理与打牌时整理手中牌的做法差不多,在开始摸牌时,我们手中时空的,牌打乱放在桌上,我们一次摸起一张牌,并将它放到手牌中的正确位置。为了找到这张正确位置,我们要将他与手中的每一张牌从右到左比较,而手牌总是排好序的。
插入排序的代码非常简单,C++代码如下:
调用如下
1959年,Donald Shell提出插入排序每次步长为1效率低下,从该提出了直接插入排序的变种——shell排序,原理即将原数组中相隔固定步长的一部分数分别进行直接插入排序,逐步减少步长,shell排序的时间复杂度依赖于所选的增量序列,C++代码如下:
第一次当然是经典的插入排序,这个几乎是每一个接触排序的程序猿看到的第一个排序算法了吧。
插入排序的原理非常简单,并且当问题规模较小或者基本有序时效率很高。按照《Introduction to Algorithms》的说法,插入排序的工作机理与打牌时整理手中牌的做法差不多,在开始摸牌时,我们手中时空的,牌打乱放在桌上,我们一次摸起一张牌,并将它放到手牌中的正确位置。为了找到这张正确位置,我们要将他与手中的每一张牌从右到左比较,而手牌总是排好序的。
插入排序的代码非常简单,C++代码如下:
//时间复杂度为O(n的平方),空间复杂度为O(1) void InsertSort(int* a,int length) { int n=length,temp,j; for(int i=1;i<n;i++) { temp=a[i]; j=i-1; while(j>=0&&a[j]>temp) { a[j+1]=a[j]; j--; } a[j+1]=temp; } }
调用如下
#include "stdafx.h" #include <iostream> #include <ctime> using namespace std; const int ARRAYSIZE=50; void InsertSort(int* ,int); int _tmain(int argc, _TCHAR* argv[]) { int *myarray=new int[ARRAYSIZE]; int indata; srand((unsigned)time(NULL)); for(int i=0;i<ARRAYSIZE;i++) { myarray[i]=rand()%100; } InsertSort(myarray,ARRAYSIZE); for(int i=0;i<ARRAYSIZE;i++) { cout<<myarray[i]<<" "; if(i%10==0) cout<<endl; } cin>>indata; return 0; }
1959年,Donald Shell提出插入排序每次步长为1效率低下,从该提出了直接插入排序的变种——shell排序,原理即将原数组中相隔固定步长的一部分数分别进行直接插入排序,逐步减少步长,shell排序的时间复杂度依赖于所选的增量序列,C++代码如下:
void ShellSort(int *a,int length,int d) { int temp,j; for(int i=d;i<length;i++) { temp=a[i]; j=i-d; while(j>=0&&a[j]>temp) { a[j+d]=a[j]; j=j-d; } a[j+d]=temp; } }
相关文章推荐
- 排序算法-shell排序-改良的插入排序
- 用Python实现基本排序算法03——插入排序
- 基本排序算法——插入排序java实现
- 排序算法--插入排序(直接插入排序、折半插入、shell排序)的java实现
- 插入排序是基本排序算法中最好的一种,虽然插入排序也是需要O(N^2)时间,但它比冒泡排序快一倍,比选择排序还要快点。
- 基本排序算法及分析(三):shell排序
- 面试最基本的三种排序算法 冒泡排序 插入排序 选择排序
- 基本排序算法(冒泡排序,选择排序,插入排序)后续[时间测试]
- java基本排序算法-插入排序-快速排序-选择排序-冒泡排序
- 经典算法(8)- 插入排序(Insertion Sort) 及三个基本排序算法的比较
- PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
- 基本排序算法(冒泡排序,选择排序,插入排序)后续[时间测试]
- 排序算法(插入排序、shell排序、冒泡排序、选择排序、合并排序、堆排序、快速排序、计数排序、基数排序、桶排序)
- 基本排序算法及其在MapReduce的应用
- 基本排序算法之插入排序
- C/C++程序员:基本排序算法之插入排序
- C语言实现基本排序算法----排序(直接插入排序,SHELL排序,冒泡排序,快速排序,简单选择排序,堆排序)
- 排序算法之插入排序及其改进
- 基本排序算法(冒泡排序 选择排序 插入排序 快速排序 归并排序 基数排序 希尔排序)
- 用Python实现基本排序算法04——Shell排序