Python的排序算法

要求:将数组中元素按照从小到大对列表,进行排序

一、冒泡排序

这里写图片描述

bubble_list=[4,213,5,6,12,123,45,66,43]
def bubble(array):
    for i in range(len(array)-1):   ##外循环,每次循环找出最大值放在最右边,下一次则忽略前面循环找出的数
        for j in range(len(array)-1-i):  ##内循环,和下一个数比较,若第一个数较大,则进行交换
            if array[j]>array[j+1]:
                tmp=array[j]
                array[j]=array[j+1]
                array[j+1]=tmp
bubble(bubble_list)
print "Final:%s" % bubble_list
Final:[4, 5, 6, 12, 43, 45, 66, 123, 213]
二、选择排序

这里写图片描述

select_list=[25,213,5,6,12,123,45,66,43]
def select(array):
    for i in range(len(array)-1):   ##从第一个数开始依次与后面的数对比,若有数比数组中第一个小,则进行交换。循环len(array)-1次。
        for j in range(i+1,len(array)):
            if array[i]>array[j]:
                tmp=array[i]
                array[i]=array[j]
                array[j]=tmp
select(select_list)
print "Final:%s" % select_list

这样的选择排序有一个弊端,i每次循环,都可能有很多数据交换过程,因此,怎样解决这样的问题呢?
只需要引入一个变量,least_index每次判断大小后,只需要把数值更小的下标赋值给least_index即可。

select_list=[25,213,5,6,12,123,45,66,43]
def select_plus(array):
    for i in range(len(array)-1):
        least_index=i
        for j in range(i+1,len(array)):
            if array[least_index]>array[j]:
                least_index=j
        tmp=array[i]
        array[i]=array[least_index]
        array[least_index]=tmp
select_plus(select_list)
print "Final:%s" % select_list
三、插入排序

这里写图片描述

insert_list=[25,213,5,6,12,123,45,66,43]
def insert(array):
    for i in range(1,len(array)):  #从数组中第二个数与与左边的数进行对比
        position=i
        current_var=array[position]  ##保留array[i]中的值
        while array[position-1]>current_var and position>0:            ##当左边的数大于插入数,则将两数进行交换,直到数组进行到数组首位
            array[position]=array[position-1]
            array[position-1]=current_var
            position-=1
insert(insert_list)
print "Final:%s" % insert_list
Final:[5, 6, 12, 25, 43, 45, 66, 123, 213]
四、快速排序

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

"""                                           
quick_list = [69, 471, 106, 66, 149, 983, 160]

def quickSort(L, low, high):                  
    i = low                                   
    j = high                                  
    if i >= j:                                
        return L                              
    key = L[i]                                
    while i < j:                              
        while i < j and L[j] >= key:          
            j = j-1                           
        L[i] = L[j]                           
        while i < j and L[i] <= key:          
            i = i+1                           
        L[j] = L[i]                           
    L[i] = key                                
    quickSort(L, low, i-1)                    
    quickSort(L, j+1, high)                   
    return                                    
quickSort(quick_list,0,len(quick_list)-1)     
print quick_list                              
以下是两种常见的Python排序算法的介绍和示例: 1. 计数排序: 计数排序是一种不基于比较的排序算法,它的速度更快。但是它需要额外的空间来存放排序后的数列。 算法描述: - 首先,找出待排序数组中的最大值和最小值。 - 创建一个计数数组,长度为最大值和最小值之间的差值加一。 - 遍历待排序数组,将每个元素的计数值加一。 - 遍历计数数组,将每个元素与前一个元素相加,得到每个元素在排序后数组中的位置。 - 创建一个与待排序数组相同长度的结果数组。 - 遍历待排序数组,将每个元素放入结果数组的对应位置,并将计数数组中对应元素的值减一。 - 返回结果数组作为排序后的数组。 示例代码: ```python def counting_sort(arr): min_val = min(arr) max_val = max(arr) count = [0] * (max_val - min_val + 1) for num in arr: count[num - min_val] += 1 for i in range(1, len(count)): count[i] += count[i - 1] result = [0] * len(arr) for num in arr: result[count[num - min_val] - 1] = num count[num - min_val] -= 1 return result ``` 2. 选择排序: 选择排序是一种简单但不稳定的排序算法,时间复杂度为O(n^2),适用于小数据。 算法描述: - 首先,将数组分成已排序和未排序两组。 - 遍历未排序数组,从中找出最小值的索引。 - 将最小值与未排序数组的首位元素交换位置。 - 重复上述步骤,直到未排序数组为空。 示例代码: ```python def selection_sort(arr): n = len(arr) for i in range(n - 1): min_index = i for j in range(i + 1, n): if arr[j] < arr[min_index]: min_index = j arr[min_index], arr[i] = arr[i], arr[min_index] return arr ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值