排序算法之快速排序

快速排序

快速排序(Quick Sort)使用分治法策略。
它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序流程:
(1) 从数列中挑出一个基准值。
(2) 将所有比基准值小的摆放在基准前面,所有比基准值大的摆在基准的后面(相同的数可以到任一边);在这个分区退出之后,该基准就处于数列的中间位置。
(3) 递归地把"基准值前面的子数列"和"基准值后面的子数列"进行排序。

 

按照同样的方法,对子数列进行递归遍历。最后得到有序数组!

 

1.Python实现

def SORT(array, i, j):
    if i>j:
        return
    left = i
    right = j
    x = array[i]
    while i < j:

        while i<j:

            if array[j] < x:
                array[i] = array[j]
                i += 1
                break
            j -= 1

        while i<j :
            if array[i] > x:
                array[j] = array[i]
                j -= 1
                break
            i += 1



    array[i] = x
    SORT(array, left, i - 1)
    SORT(array, i + 1, right)


if __name__ == "__main__":
    ARRAY = [20, 40, 30, 10, 60, 50]
    SORT(ARRAY, 0, len(ARRAY) - 1)
    print(ARRAY)

2.C语言实现


void quick_sort(int a[], int l, int r)
{
   
    if (l < r)
    {
        int i,j,x;

        i = l;
        j = r;
        x = a[i];
        while (i < j)
        {
            while(i < j && a[j] > x)
                j--; // 从右向左找第一个小于x的数
            if(i < j)
                a[i++] = a[j];
            while(i < j && a[i] < x)
                i++; // 从左向右找第一个大于x的数
            if(i < j)
                a[j--] = a[i];
        }
        a[i] = x;
        quick_sort(a, l, i-1); /* 递归调用 */
        quick_sort(a, i+1, r); /* 递归调用 */
    }
}


 

3.汇编语言

;完成快速排序 5/5 TODO DOC
S0	SEGMENT STACK
	DW 30H DUP(?)
TOP	LABEL WORD
S0	ENDS
S1	SEGMENT
ARRAY	DW 20,40,30,10,50,60
COUNT	DW ($-ARRAY) ;元素个数*2
HCHH	DB 0DH,0AH,24H ;回车换行
FG		DB 2CH,20H,24H ;逗号,空格

S1	ENDS
S2	SEGMENT
	ASSUME SS:S0,DS:S1,CS:S2
MAIN	PROC FAR
	MOV AX,S0
	MOV SS,AX
	LEA SP,TOP
	MOV AX,S1
	MOV DS,AX
	MOV ES,AX
	
	XOR AX,AX
	CALL OUTP
	
QQSORT:
	MOV BX,0
	MOV BP,COUNT
	SUB BP,2
	CALL Qsort
	
FINISH:
	JMP EXIT
	
EXIT:
	MOV AH,4CH
	INT 21H
	
MAIN	ENDP
Qsort PROC NEAR ;快排递归程序
	PUSH BX
	PUSH BP
	PUSH DI
	
QsortC1:
	CMP BX,BP
	JGE QsortC2
	CALL GetP
	CALL OUTP
	PUSH DI
	PUSH BP
	MOV BP,DI
	SUB BP,2
	CALL Qsort
	POP BP
	POP DI
	PUSH BX
	MOV BX,DI
	ADD BX,2
	CALL Qsort
	POP BP
	
QsortC2:
	POP DI
	POP BP
	POP BX
	RET
Qsort	ENDP

GetP PROC NEAR ;快排获取基准数子程序
	PUSH AX
	PUSH DX
	PUSH BX
	PUSH BP
	
	MOV AX,ARRAY[BX]
	MOV DX,AX
	
GetP_W0:			;获取基准的第一个while循环
	CMP BX,BP
	JGE GetPC1
	
GetP_W1:			;获取基准的第二个while循环
	CMP BX,BP
	JGE GetPCHG1
	CMP ARRAY[BP],AX
	JL GetPCHG1
	SUB BP,2
	JMP GetP_W1
	
GetPCHG1:		;第一个while的赋值
	MOV CX,ARRAY[BP]
	MOV ARRAY[BX],CX

GetP_W2:			;获取基准的第三个while循环
	CMP BX,BP
	JAE GetPCHG2
	CMP ARRAY[BX],AX
	JG GetPCHG2
	ADD BX,2
	JMP GetP_W2
	
GetPCHG2:		;第二个while的赋值
	MOV CX,ARRAY[BX]
	MOV ARRAY[BP],CX
	
	JMP GetP_W0
	
GetPC1:
	MOV ARRAY[BX],DX
	MOV DI,BX
	
	
	POP BP
	POP BX
	POP DX
	POP AX
	RET
	
GetP ENDP
OUTP PROC NEAR
;这段程序是用来输出数组里面的内容的,用逗号,空格分隔,最后输出回车换行
	PUSH AX
	PUSH BX
	PUSH CX
	PUSH DX
	PUSH BP
	PUSH DI
	PUSH SI
	
	MOV BX,0
	MOV CX,COUNT
	LEA SI,ARRAY
	SHR CX,1
	
OUTP_PRINT:
	MOV BX,[SI]
	MOV AX,BX
	OR AX,AX
	JNS OUTP_ZS;ZS表示->正数
	MOV AH,2
	MOV DL,2DH
	INT 21H
	NEG BX
OUTP_ZS:
	MOV AX,BX
	XOR BP,BP
OUTP_L1:
	XOR DX,DX
	MOV DI,10
	DIV DI
	INC BP
	PUSH DX
	CMP AX,0
	JNE OUTP_L1

OUTP_L2:
	POP DX
	ADD DL,30H
	MOV AH,2
	INT 21H
	DEC BP
	JNE OUTP_L2
	
	;, 分隔
	CMP CX,2
	JS  OUTP_L3
	MOV AH,9
	LEA DX,FG
	INT 21H
	
OUTP_L3:
	ADD SI,2
	LOOP OUTP_PRINT
	
	;回车换行
	LEA DX,HCHH
	MOV AH,9
	INT 21H
	
	POP SI
	POP DI
	POP BP
	POP DX
	POP CX
	POP BX
	POP AX
	RET
OUTP ENDP

CRLF PROC NEAR ;回车换行
	PUSH DX
	PUSH AX
	LEA DX,HCHH
	MOV AH,9
	INT 21H
	POP AX
	POP DX
	RET
CRLF ENDP
	
S2	ENDS
	END MAIN

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值