1. 程式人生 > >插入排序——C#實現

插入排序——C#實現

       一 演算法描述

       插入排序是一種針對少量元素的有效的排序演算法。其基本操作是將一個數據插入到已經排好序的有序資料中,從而得到一個新的、個數加一的有序資料。在《演算法導論》一書中,作者以人們常用的排序撲克牌的例子來說明此演算法:

       “開始時,我們的左手為空並且桌子上的牌面向下。然後,我們毎次從桌子上拿走一張牌並將它插入左手中正確的位置。為了找到一張牌的正確位置,我們從右到左將它與已在手中的每張牌進行比較。拿在左手上的牌總是排序好的。”

       

       (圖片擷取自《演算法導論》)

       二 演算法實現(c#)

       1 用於整數陣列的升序排序

        public static void InsertionSort(int[] array)
        {
            if (array == null || array.Length < 2)
            {
                return;
            }

            int key;
            for (int i = 1; i < array.Length; i++)
            {
                key = array[i];
                int j = i - 1;
                while (j >= 0 && key < array[j])
                {
                    array[j + 1] = array[j];
                    j--;
                }
                array[j + 1] = key;
            }
        }

       2 用於整數陣列的降序排序

        public static void InsertionDesSort(int[] array)
        {
            if (array == null || array.Length < 2)
            {
                return;
            }

            int key;
            for (int i = 1; i < array.Length; i++)
            {
                key = array[i];
                int j = i - 1;
                while (j >= 0 && key > array[j])
                {
                    array[j + 1] = array[j];
                    j--;
                }
                array[j + 1] = key;
            }
        }
       3 泛型版本
        public static void InsertionSort<T>(T[] array, Comparison<T> comparison)
        {
            if (array == null || array.Length < 2)
            {
                return;
            }

            T key;
            for (int i = 1; i < array.Length; i++)
            {
                key = array[i];
                int j = i - 1;
                while (j >= 0 && comparison(array[j], key) > 0)
                {
                    array[j + 1] = array[j];
                    j--;
                }
                array[j + 1] = key;
            }
            return;
        }


       三 演算法分析

       1 插入排序是一種原址排序演算法。在整個排序過程中只需要常數個元素儲存在陣列之外,即空間複雜度為O(1)。

       2 插入排序是穩定的。具有相同值的元素在輸出陣列中的相對次序與其在輸入陣列中的相對次序相同。

       3 若輸入陣列已經排好序,則演算法執行時間未最佳情況,此時的時間複雜度是O(n);若輸入陣列已反向排序,則演算法的執行時間未最壞情況,此時的時間複雜度為O(n^2).

       四 執行結果

       在插入排序演算法中,影響演算法執行時間的主要因素為內層while迴圈的執行次數。而內層迴圈的執行次數,則可以根據array[j]與key的比較次數來大致估算(此處內層迴圈執行的語句的數量約為比較次數的4倍)。因此,如果我們得到了比較語句的執行次數,則可以大致瞭解到整個演算法的執行規模。

       在演算法的泛型實現版本中,通過在委託傳入的比較方法里加入計數語句,則能很容易的得到比較語句執行的次數。

        private static int AscComparison(int x, int y)
        {
            count++;
            if (x > y)
            {
                return 1;
            }
            else if (x == y)
            {
                return 0;
            }
            else
            {
                return -1;
            }
        }

       為了測試該演算法的平均執行情況,通過對10000個隨機陣列進行排序取平均:

        static void Main(string[] args)
        {
            for (int i = 0; i < 10000; i++)
            {
                //在1-100內產生10個隨機數
                int[] randomIntArray = DataCreator.CreateRandomIntArray(1, 100, 10);
                Sort.InsertionSort(randomIntArray, AscComparison);
                PrintAarry(randomIntArray);
            }
            int averageCount = count / 10000;
            Console.WriteLine(averageCount);
        }

       測試結果:

       n = 10,  averageCount = 29 = 0.29 * 10 ^2;

       n = 100,   averageCount = 2567 = 0.2567 * 100 ^ 2;

       n = 1000, averageCount = 250724 = 0.250724 * 1000^2

       由此可得,插入排序演算法的平均執行時間複雜度也是θ(n^2).

相關推薦

插入排序(c++實現)

github部落格傳送門 csdn部落格傳送門 插入排序原理: #include<iostream> using namespace std; //插入排序 void InsertionSort(int a[], int size) { int i; //有序區

插入排序——C#實現

       一 演算法描述        插入排序是一種針對少量元素的有效的排序演算法。其基本操作是將一個數據插入到已經排好序的有序資料中,從而得到一個新的、個數加一的有序資料。在《演算法導論》一書中,作者以人們常用的排序撲克牌的例子來說明此演算法:        “開

常見排序演算法總結與分析之交換排序插入排序-C#實現

# 前言 每每遇到關於排序演算法的問題總是不能很好的解決,對一些概念,思想以及具體實現的認識也是模稜兩可。歸根結底,還是掌握不夠熟練。以前只是看別人寫,看了就忘。現在打算自己寫,寫些自己的東西,做個總結。本篇是這個總結的開始,所以我們先來闡述一下本次總結中會用到的一些概念。 排序是如何分類的?可以從不同的的角

基本插入排序實現C++)

#include <iostream> using namespace std; void print(int a[], int n ,int i){ cout<<i <<":"; for(int j= 0; j<8; j++){

【初探】“直接插入排序”—— C++程式碼實現

目錄 直接插入排序簡介 演算法步驟 演算法演示 複雜度分析 穩定性 直接插入排序演算法的特點 直接插入排序簡介 ● 插入排序是一種簡單直觀的排序演算法,它也是基於比較的排序演算法。它的工作原理是通過不斷擴張有序序列的範圍,對於未排序的資料,在已排序中從

“直接插入排序C++/python實現

對一組資料進行插入排序的方法是: 1)假定一組資料的第一個是有序的,剩下的是無序的。 2)從無序資料中取第一個,與有序資料組相比較,插入到有序資料中。 3)從無序資料再取第一個,與有序資料組相比較,插入到有序資料中。 4)無序資料中取完,即排序完成。 比如:3 ,7

插入排序C語言實現程式碼

<span style="font-size:18px;">#include<stdio.h> void main() { int A[6]={5,2,4,6,1,3};

插入排序c遞迴實現和非遞迴實現

1.特點  :在部分有序的情況下,插入排序效率很高,和選擇排序 不一樣的是,排序的效率受輸入序列的影響很大             平均時間複雜度O(n^2)       最好情況下  O(n)     最壞情況下O(^2) 2.程式碼實現   迭代的方式實現  void

選擇排序——C實現

return 最大 n-1 spa 工作 cnblogs ret clu 輸出 選擇排序:   選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩余未排序元素中繼續

排序 C++實現

logs pso int brush -- cpp end tac 排序 #include<iostream> #include<vector> #include<stack> #include<algorithm> #in

基數排序c++實現

復雜 -- cpp ++ stream c++實現 sin logs 中心 //中心思想,按照低位先排序,然後收集,再按照高位排序,然後再收集, //以此類推,直到最高位,是穩定算法,效率很高,復雜度是O(n㏒(r)m),r為采取的基數 //m為堆數,但是只能用在整數中,

直接插入排序(Java實現)

插入排序 直接插入排序 javastatic void insertionSort(int[] unsorted){ for (int i = 1; i < unsorted.length; i++) { if (unsorted[i - 1] > unsorted[i])

直接插入排序(go實現)

排序 插入排序 直接插入排序 golang gopackage main import "fmt" func main() { arr := []int{11, 2, 7, 11, 88, 91, 23, 14, 12, 33} straightInsertSort(arr) fo

直接插入排序C/C++

ons lex clas 最好 循環條件 逆序 時間 size 復雜度 void InsertionSort(int a[],int len); /* 算法: */ //由小到大的直接插入排序 direct insertionsort void Inserti

插入排序實現與分析

讓你對一副雜亂無序的撲克牌進行排序,最常用的方法就是插入排序了。 插入排序的原理很簡單,在雜亂的牌中選出一張牌,然後把它插入到應有的位置,假設是從左到右依次遞減的。以鬥地主的規則為例,現在你手上的牌有{3, 2, J, K, A},那麼“2”就應該插在“3”前面,變成{2, 3, J, K, A

直接插入排序 java實現

直接插入排序的演算法思路是: 基於給定的一個數組,初始時假設第一個記錄自成一個有序序列,其餘記錄為無序序列。接著從第二個記錄開始,按照記錄的大小依次將當前處理的記錄插入到其之前的有序序列中,直至最後一個記錄插入到有序序列中為止。 package demo; public clas

1045 快速排序——c實現

1045 快速排序 (25 分) 著名的快速排序演算法裡有一個經典的劃分過程:我們通常採用某種方法取一個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。 給定劃分後的 N 個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元? 例

08_資料結構與演算法_插入排序_Python實現

""" 插入排序: 其思想類似於手中有一些亂序的撲克牌,要將其整理為有序的。 首先拿第二張,與之前一張對比,小於第一張時交換順序,大於時保持不動。 這樣i輪過後,第i大的牌就會出現在第i個位置。 """ import random def insertion_sort(

插入排序演算法實現

輸入:n個數(a1,a2........) 輸出:升序排列好的陣列 #include <stdio.h> #include <stdlib.h> int main() { int i,j,n,a[100]; printf("請輸入要排序的陣列

直接插入排序——C語言

插入排序是最簡單的一種排序方法。它的基本操作就是將一個記錄插入到已排好序的有序表中,從而得到一個新的、記錄數增1的有序表。 直接插入排序時,我們將第二個陣列元素作為插入數,第一個數作為有序陣列。逐個比較兩者大小,最後將數插入到合適位置。 程式碼實現: /**插入排序**