插入排序(算法导论中的伪代码实现)

本文介绍了插入排序的基本原理和工作方式,通过扑克牌排序的比喻来解释其过程。提供了伪代码和Java、Python两种语言的实现代码示例,帮助读者理解如何在实际编程中应用插入排序算法进行数组排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们首先介绍插入排序,对于少量元素的排序,它是一个有效的算法。插人排序的工作方式像许多人排序一手扑克牌。 开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插人左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的,原来这些牌是桌子上牌
堆中顶部的牌。
对于插入排序,我们将其伪代码过程命名为INSERTION SORT,其中的参数是一个数组 A[..n],包含长度为n的要排序的一个序列。(在代码中,A中元素的数目n用A. length来表示。)该算法原址排
序输人的数:算法在数组A中重排这些数,在任何时候,最多只有其中的常数个数字存储在数组外
面。在过程INSERTION-SORT结束时,输人数组A包含排序好的输出序列。

伪代码如下:
INSERTIONSORT(A):
1 forj = 2 to A. length
2        key= A[j]
3        // Insert A[j] into the sorted sequenceA[1..j一1] 

4        i =  j - 1
5      whilei> 0 and A[门> key
6                A[i+1]= A[i]
7                i=i- 1
8        A[i+ 1]= key

JAVA代码:

package suanfa;
import java.util.*;


public class InsertSort {
    public static int[] Sort(int[] arr) { //插入排序函数
        int n = arr.length;
        for(int j = 1; j < n; j++){
            int key = arr[j];
            int i = j-1;
            while(i >= 0 && arr[i] > key){ //找到合适的位置,将每一次的新数据插入
                arr[i+1]=arr[i];
                i = i -1;
            }
            arr[i+1] = key;
        }

        return arr;

    }
    public static void main(String args[]){
        int n;
        Scanner input = new Scanner(System.in);
        System.out.println("请输入需要排序的数字个数:");
        n = input.nextInt();
        int[] arr = new int[n];
        for (int i = 0;i<n;i++){
            arr[i] = input.nextInt();
        }
        arr = Sort(arr);

        for (int i = 0;i < arr.length;i++){
            System.out.printf(arr[i]+" ");
        }

    }


}

Python代码:


def InsertSort(list1) :
    n = len(list1)
    for j in range(1,n):
        key = list1[j]
        i = j - 1
        while i >= 0 and list1[i] > key:
            list1[i + 1] = list1[i]
            i = i-1
        list1[i+1] = key
    return list1

n = int(input("请输入需要排序的个数"))
list1=[]
for i in range(0,n):
    k = int(input("请输入值:"))
    list1.append(k)
list1 = InsertSort(list1)


print(list1)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值