基于插入的排序算法

来源:互联网 发布:excel表格查找重复数据 编辑:程序博客网 时间:2024/06/05 11:47

排序算法被分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因为排序的数据量很大,一次性不能容纳全部的排序记录,

在排序的过程中是要访问外存的。我们所讨论的几种排序算法均为内部排序。

八大排序算法大体可分为:基于插入,基于交换,基于选择,归并和基数排序,这里先讲基于插入的两种排序。

一、直接插入排序(Insertion Sort)

基本思想:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中适当的位置,直到全部记录插入完成为止。

代码实现:

public class InsertSort {public void inserSort(int[] array){int i;int j;for(i=1; i<array.length; i++){int temp = array[i];for(j=i-1; j>=0&&array[j]>temp; j--){array[j+1] = array[j]; }array[j+1] = temp;}}} 

因为整个插入的过程中,经过了两重循环,所以时间复杂度为O(n^2)     

二、希尔排序(Shell's Sort)

基本思想:希尔排序的实质是分组插入排序。先将整个带排序元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接 插入排序。因为直接插入排序在元素基本有序的情况下,效率是很高的。

代码实现:

public class ShellSort {public void shellSort(int[] array){int gap = array.length/2;//设置一个增量//用插入排序的思想按照gap的位置对数组进行排序int temp;while(gap > 0){for(int i=gap; i<array.length; i++){temp = array[i];int j;for(j=i-gap; j>=0&&temp<array[j]; j=j-gap){array[j+gap] = array[j];}array[j+gap] = temp;}gap = gap/2;}}}

希尔排序是插入排序的一种实现,但是希尔排序的时间复杂度要比直接插入排序高很多,希尔排序的时间复杂度为O(n^(1+x),0<X<1)。


0 0