排序算法之选择排序

本文详细介绍了选择排序算法的基本原理和实现过程。通过实例演示了选择排序的步骤,包括如何在未排序序列中查找最小元素并将其放置到正确的位置,直至整个序列排序完成。提供了Python、C语言和汇编语言三种实现方式的代码示例。

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

选择排序

选择排序(Selection sort)是一种简单直观的排序算法。
它的基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

  流程如图所示

排序流程

第1趟:i=0。找出a[1...5]中的最小值a[3]=10,然后将a[0]和a[3]互换。 数列变化:20,40,30,10,60,50 -- > 10,40,30,20,60,50
第2趟:i=1。找出a[2...5]中的最小值a[3]=20,然后将a[1]和a[3]互换。 数列变化:10,40,30,20,60,50 -- > 10,20,30,40,60,50
第3趟:i=2。找出a[3...5]中的最小值,由于该最小值大于a[2],该趟不做任何处理。 
第4趟:i=3。找出a[4...5]中的最小值,由于该最小值大于a[3],该趟不做任何处理。 
第5趟:i=4。交换a[4]和a[5]的数据。 数列变化:10,20,30,40,60,50 -- > 10,20,30,40,50,60

代码实现:

1.Python实现

ARRAY = [20, 40, 30, 10, 60, 50]
for i in range(len(ARRAY) - 1):

    for j in range(i + 1, len(ARRAY)):
        if ARRAY[j] < ARRAY[i]:
            temp = ARRAY[j]
            ARRAY[j] = ARRAY[i]
            ARRAY[i] = temp
    print(ARRAY)

2.C语言实现

 int i;        // 有序区的末尾位置
    int j;        // 无序区的起始位置
    int min;    // 无序区中最小元素位置
    int a[6]={20, 40, 30, 10, 60, 50}
    for(i=0; i<n; i++)
    {
        min=i;

        // 找出"a[i+1] ... a[n]"之间的最小元素,并赋值给min。
        for(j=i+1; j<n; j++)
        {
            if(a[j] < a[min])
                min=j;
        }

        // 若min!=i,则交换 a[i] 和 a[min]。
        // 交换之后,保证了a[0] ... a[i] 之间的元素是有序的。
        if(min != i)
            swap(a[i], a[min]);
    }

 

3.汇编实现

DATAS SEGMENT
    ARRAY DB 20, 40, 30, 10, 60, 50
    NUM EQU $-ARRAY  
    NEWSPACE DB '  ','$'
DATAS ENDS
 
STACKS SEGMENT
    
    DW 40H DUP(?)
    TOP LABEL WORD
STACKS ENDS
 
CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV AX,STACKS
    MOV SS,AX
    LEA SP,TOP
    MOV CX,NUM
    LEA BX,ARRAY
    MOV SI,0
    MOV DI,0
    DEC CX ;需要对比几趟
OUTTER:
	PUSH CX;保存外层第几趟
	MOV AH,[BX+SI];前后俩数大小
	MOV DI,SI
	INC DI
	
INNER:
	
	
	MOV AL,[BX+DI];前后俩数大小
	CMP AL,AH;前后俩数大小
	JB XCHANGE;前者大于后者则交换位置
NEXT:
	
	INC DI
	LOOP INNER 
	INC SI
	POP CX
	LOOP OUTTER
	JMP EXIT
 
XCHANGE:
    ;交换位置
	
	MOV [BX+SI],AL
	MOV [BX+DI],AH
	JMP NEXT
    
    
EXIT:
	MOV CX,NUM
	MOV SI,0
	PRINTF:
		XOR AX,AX
		PUSH CX
		MOV AL,ARRAY[SI]
		INC SI
		MOV CX,0
		PUSHIN:
			XOR DX,DX
			MOV BX,10
			DIV BX
			PUSH DX
			INC CX
			CMP AX,0
			JNE PUSHIN
		POPOUT:
			POP DX
			ADD DL,30H
			MOV AH,2H
			INT 21H
 
			LOOP POPOUT
		
		POP CX
		LEA DX,NEWSPACE
		MOV AH,9H
		INT 21H
		LOOP PRINTF
	
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START
 




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值