📜  插入排序

📅  最后修改于: 2021-04-29 07:46:56             🧑  作者: Mango

插入排序是一种简单的排序算法,其工作方式类似于您手中对扑克牌进行排序的方式。该数组实际上被分为一个已排序部分和一个未排序部分。挑选未排序部分中的值,并将其放置在已排序部分中的正确位置。
算法
要按升序对大小为n的数组进行排序:
1:在数组上从arr [1]迭代到arr [n]。
2:将当前元素(键)与其前一个元素进行比较。
3:如果关键元素小于其前任元素,请将其与之前的元素进行比较。将较大的元素上移一个位置,以为交换的元素留出空间。
例子:

插入排序

另一个例子:
12,11,13,5,6
让我们将i = 1(数组的第二个元素)循环到4(数组的最后一个元素)
i =1。由于11小于12,所以移动12并在12之前插入11
11、12、13、5、6
i =2。由于A [0..I-1]中的所有元素都小于13,因此13将保留在其位置
11、12、13、5、6
i =3。5将移至开头,所有其他元素从11到13将移至其当前位置的一个位置。
5,11,12,13,6
i =4。6将移动到5之后的位置,而11到13的元素将移动其当前位置之前的一个位置。
5、6、11、12、13

C++
// C++ program for insertion sort
#include 
using namespace std;
 
/* Function to sort an array using insertion sort*/
void insertionSort(int arr[], int n)
{
    int i, key, j;
    for (i = 1; i < n; i++)
    {
        key = arr[i];
        j = i - 1;
 
        /* Move elements of arr[0..i-1], that are
        greater than key, to one position ahead
        of their current position */
        while (j >= 0 && arr[j] > key)
        {
            arr[j + 1] = arr[j];
            j = j - 1;
        }
        arr[j + 1] = key;
    }
}
 
// A utility function to print an array of size n
void printArray(int arr[], int n)
{
    int i;
    for (i = 0; i < n; i++)
        cout << arr[i] << " ";
    cout << endl;
}
 
/* Driver code */
int main()
{
    int arr[] = { 12, 11, 13, 5, 6 };
    int n = sizeof(arr) / sizeof(arr[0]);
 
    insertionSort(arr, n);
    printArray(arr, n);
 
    return 0;
}
 
// This is code is contributed by rathbhupendra


C
// C program for insertion sort
#include 
#include 
 
/* Function to sort an array using insertion sort*/
void insertionSort(int arr[], int n)
{
    int i, key, j;
    for (i = 1; i < n; i++) {
        key = arr[i];
        j = i - 1;
 
        /* Move elements of arr[0..i-1], that are
          greater than key, to one position ahead
          of their current position */
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j = j - 1;
        }
        arr[j + 1] = key;
    }
}
 
// A utility function to print an array of size n
void printArray(int arr[], int n)
{
    int i;
    for (i = 0; i < n; i++)
        printf("%d ", arr[i]);
    printf("\n");
}
 
/* Driver program to test insertion sort */
int main()
{
    int arr[] = { 12, 11, 13, 5, 6 };
    int n = sizeof(arr) / sizeof(arr[0]);
 
    insertionSort(arr, n);
    printArray(arr, n);
 
    return 0;
}


Java
// Java program for implementation of Insertion Sort
class InsertionSort {
    /*Function to sort array using insertion sort*/
    void sort(int arr[])
    {
        int n = arr.length;
        for (int i = 1; i < n; ++i) {
            int key = arr[i];
            int j = i - 1;
 
            /* Move elements of arr[0..i-1], that are
               greater than key, to one position ahead
               of their current position */
            while (j >= 0 && arr[j] > key) {
                arr[j + 1] = arr[j];
                j = j - 1;
            }
            arr[j + 1] = key;
        }
    }
 
    /* A utility function to print array of size n*/
    static void printArray(int arr[])
    {
        int n = arr.length;
        for (int i = 0; i < n; ++i)
            System.out.print(arr[i] + " ");
 
        System.out.println();
    }
 
    // Driver method
    public static void main(String args[])
    {
        int arr[] = { 12, 11, 13, 5, 6 };
 
        InsertionSort ob = new InsertionSort();
        ob.sort(arr);
 
        printArray(arr);
    }
} /* This code is contributed by Rajat Mishra. */


Python
# Python program for implementation of Insertion Sort
 
# Function to do insertion sort
def insertionSort(arr):
 
    # Traverse through 1 to len(arr)
    for i in range(1, len(arr)):
 
        key = arr[i]
 
        # Move elements of arr[0..i-1], that are
        # greater than key, to one position ahead
        # of their current position
        j = i-1
        while j >= 0 and key < arr[j] :
                arr[j + 1] = arr[j]
                j -= 1
        arr[j + 1] = key
 
 
# Driver code to test above
arr = [12, 11, 13, 5, 6]
insertionSort(arr)
for i in range(len(arr)):
    print ("% d" % arr[i])
 
# This code is contributed by Mohit Kumra


C#
// C# program for implementation of Insertion Sort
using System;
 
class InsertionSort {
 
    // Function to sort array
    // using insertion sort
    void sort(int[] arr)
    {
        int n = arr.Length;
        for (int i = 1; i < n; ++i) {
            int key = arr[i];
            int j = i - 1;
 
            // Move elements of arr[0..i-1],
            // that are greater than key,
            // to one position ahead of
            // their current position
            while (j >= 0 && arr[j] > key) {
                arr[j + 1] = arr[j];
                j = j - 1;
            }
            arr[j + 1] = key;
        }
    }
 
    // A utility function to print
    // array of size n
    static void printArray(int[] arr)
    {
        int n = arr.Length;
        for (int i = 0; i < n; ++i)
            Console.Write(arr[i] + " ");
 
        Console.Write("\n");
    }
 
    // Driver Code
    public static void Main()
    {
        int[] arr = { 12, 11, 13, 5, 6 };
        InsertionSort ob = new InsertionSort();
        ob.sort(arr);
        printArray(arr);
    }
}
 
// This code is contributed by ChitraNayal.


PHP
= 0 && $arr[$j] > $key)
        {
            $arr[$j + 1] = $arr[$j];
            $j = $j - 1;
        }
         
        $arr[$j + 1] = $key;
    }
}
 
// A utility function to
// print an array of size n
function printArray(&$arr, $n)
{
    for ($i = 0; $i < $n; $i++)
        echo $arr[$i]." ";
    echo "\n";
}
 
// Driver Code
$arr = array(12, 11, 13, 5, 6);
$n = sizeof($arr);
insertionSort($arr, $n);
printArray($arr, $n);
 
// This code is contributed by ChitraNayal.
?>


Javascript


输出:

5 6 11 12 13

时间复杂度: O(n ^ 2)
辅助空间: O(1)
边界情况:如果元素以相反顺序排序,则插入排序将花费最多时间进行排序。并且已经对元素进行排序所需的时间最少(n阶)。
算法范式:增量方法
到位排序:
稳定:是的
在线:是的
用途:当元素数较少时,使用插入排序。当输入数组几乎排序时,只有很少的元素在完整的大数组中错放了,它也很有用。
什么是二进制插入排序?
我们可以使用二进制搜索来减少普通插入排序中的比较次数。二进制插入排序使用二进制搜索来找到正确的位置,以便在每次迭代时插入所选项目。在普通插入中,在最坏的情况下,排序需要O(i)(在第i次迭代时)。我们可以使用二进制搜索将其简化为O(logi)。总体而言,由于每次插入都需要进行一系列交换,因此该算法在最坏情况下仍具有O(n ^ 2)的运行时间。请参考此实现。
如何实现对链表的插入排序?
以下是链表的简单插入排序算法。

1) Create an empty sorted (or result) list
2) Traverse the given list, do following for every node.
......a) Insert current node in sorted way in sorted or result list.
3) Change head of given linked list to head of sorted (or result) list. 

请参考此实现。

https://youtu.be/OGzPmgsI

-pQ