快速排序算法简述及python的实现

 1 def kp(arr, i, j):
 2     if i<j:  #i=j时意味着一边只剩单个数据
 3         base = kpgc(arr, i, j)
 4         kp(arr, i, base-1)  #kp(arr, i, base)也可以,相当于把base放进去重新排了一遍,但是由于base大于左边的,没什么影响
 5         kp(arr, base+1, j)
 6 
 7 def kpgc(arr, i, j):
 8     base = arr[i]   #第一个数字作为基准数字
 9     while i < j:
10         if arr[j] >= base: #当活动指针j指向数据大于或等于基准数字时,该数据未发生交叉,放右边,
11             j -= 1      #活动指针同时像左移
12         if arr[j] < base:   #当活动指针j指向数据小于基准数字时,该数据发生交叉,
13             arr[i] = arr[j]  #指向数据放左边(此时arr[i]值已被赋给base)
14             i += 1    #i指针向右移
15             arr[j] = arr[i]   #为了使活动指针一直在j处,直接将i处值赋到j指针处
16     arr[i] = base  #将基准数字放至被分两组之间
17     return i  将基准数字所处的索引(即位置)返回
18 
19 arr = [1,3,7,8,5,6,3,4]
20 kp(arr,0,len(arr)-1)
21 print(arr)

快排算法简述:

1,先从一组数字中任意取一个基准数字(我们以第一个数字为基准数字),将剩下数字以下列方式排在基准数字两侧,左/右侧数字全小/大于基准数字

方式:除基准数字之外,指针i指向第一个数字位置,指针j指向最后一个数字位置,活动指针最开始指向j,

           若r[j]大于或等于基准数字,则放于基准数字右侧,j指针左移,活动指针仍在j处,

           若小于,则放于左侧,发生交叉位置互换,此时活动指针移到i处(活动指针在哪则比较哪个数字)

2,再将基准数字两侧数字分别重复1做法直到每侧都为一个数字

python的实现

主要靠递归

为了减少活动指针移动的麻烦,这里使用将i位置的值传送到j处

ps:所写都是学习笔记,非原创,但理解,不知道为什么代码老是在上面

posted @ 2020-08-22 21:23  z&Dionysus  阅读(107)  评论(0编辑  收藏  举报