Ytl's Java Blog

          厚積而薄發(fā)---每一天都是一個全新的開始

          Algorithms to Insertion Sort

          Posted on 2011-05-08 12:24 ytl 閱讀(449) 評論(0)  編輯  收藏

          Insertion Sort

          Insertion sort belongs to the O(n2) sorting algorithms. Unlike many sorting algorithms with quadratic complexity, it is actually applied in practice for sorting small arrays of data. For instance, it is used to improve quicksort routine. Some sources notice, that people use same algorithm ordering items, for example, hand of cards.

          Algorithm

          Insertion sort algorithm somewhat resembles selection sort. Array is imaginary divided into two parts - sorted one andunsorted one. At the beginning, sorted part contains first element of the array and unsorted one contains the rest. At every step, algorithm takes first element in the unsorted part and inserts it to the right place of the sorted one. Whenunsorted part becomes empty, algorithm stops. Sketchy, insertion sort algorithm step looks like this:

          Insertion sort sketchy, before insertion

          becomes

          Insertion sort sketchy, after insertion

          The idea of the sketch was originaly posted here.

          Let us see an example of insertion sort routine to make the idea of algorithm clearer.

          Example. Sort {7, -5, 2, 16, 4} using insertion sort.

          Insertion sort example

          The ideas of insertion

          The main operation of the algorithm is insertion. The task is to insert a value into the sorted part of the array. Let us see the variants of how we can do it.

          "Sifting down" using swaps

          The simplest way to insert next element into the sorted part is to sift it down, until it occupies correct position. Initially the element stays right after the sorted part. At each step algorithm compares the element with one before it and, if they stay in reversed order, swap them. Let us see an illustration.

          insertion sort, sift down illustration

          This approach writes sifted element to temporary position many times. Next implementation eliminates those unnecessary writes.

          Shifting instead of swapping

          We can modify previous algorithm, so it will write sifted element only to the final correct position. Let us see an illustration.

          insertion sort, shifting illustration

          It is the most commonly used modification of the insertion sort.

          Using binary search

          It is reasonable to use binary search algorithm to find a proper place for insertion. This variant of the insertion sort is calledbinary insertion sort. After position for insertion is found, algorithm shifts the part of the array and inserts the element. This version has lower number of comparisons, but overall average complexity remains O(n2). From a practical point of view this improvement is not very important, because insertion sort is used on quite small data sets.

          Complexity analysis

          Insertion sort's overall complexity is O(n2) on average, regardless of the method of insertion. On the almost sorted arrays insertion sort shows better performance, up to O(n) in case of applying insertion sort to a sorted array. Number of writes is O(n2) on average, but number of comparisons may vary depending on the insertion algorithm. It is O(n2) when shifting or swapping methods are used and O(n log n) for binary insertion sort.

          From the point of view of practical application, an average complexity of the insertion sort is not so important. As it was mentioned above, insertion sort is applied to quite small data sets (from 8 to 12 elements). Therefore, first of all, a "practical performance" should be considered. In practice insertion sort outperforms most of the quadratic sorting algorithms, like selection sort or bubble sort.

          Insertion sort properties

          • adaptive (performance adapts to the initial order of elements);
          • stable (insertion sort retains relative order of the same elements);
          • in-place (requires constant amount of additional space);
          • online (new elements can be added during the sort).

          Code snippets

          We show the idea of insertion with shifts in Java implementation and the idea of insertion using python code snippet.

          Java implementation

          void insertionSort(int[] arr) {

                int i,j,newValue;

                for(i=1;i<arr.length;i++){

                     newValue = arr[i];

                     j=i;

                     while(j>0&&arr[j-1]>newValue){

                         arr[j] = arr[j-1];

                         j--;

                     }

                     arr[j] = newValue;

          }

          Python implementation

          void insertionSort(L) {

                for i in range(l,len(L)):

                      j = i

                      newValue = L[i]

                      while j > 0 and  L[j - 1] >L[j]:

                           L[j] = L[j - 1]

                            j = j-1

                      }

                      L[j] = newValue

                }

          }

          主站蜘蛛池模板: 玉山县| 鄂州市| 鞍山市| 海口市| 镇远县| 新疆| 广宗县| 瓮安县| 玛纳斯县| 泸水县| 绥德县| 西青区| 哈尔滨市| 阳新县| 上林县| 贡嘎县| 长子县| 安泽县| 壶关县| 瓮安县| 隆回县| 枣阳市| 苏尼特右旗| 鄂托克旗| 手游| 宜都市| 东乌珠穆沁旗| 教育| 宁化县| 永靖县| 扶余县| 伊宁县| 淮安市| 夏邑县| 栾城县| 武安市| 本溪市| 土默特左旗| 新化县| 汉川市| 安陆市|