美文网首页每天写1000字程序员
排序算法总结(一)

排序算法总结(一)

作者: 九日照林 | 来源:发表于2018-02-25 17:01 被阅读46次

排序总结 (1)

首先我们随机生成无序序列

import numpy as np
ran=np.random.randint(low=0, high=100, size=20)

快速排序

快速排序的总体思路:
给定一个长的没有排序的杂乱序列

没有排序的序列
时间复杂度:平均$O(\log(N))$,最坏情况$O\left( N^{2}\right)$
步骤
  1. 随机选取一个pivot指针
  2. 将pivot所在的位置与最高索引所在的位置的元素对掉
  3. 设定一个元素i=最低索引
  4. 从列表到最低索引low遍历到最高索引high(j),将j号元素与pivot所在的位置high相比较大小,如果j号元素是要小于pivot的话,那么就要把j号元素和i号元素对掉(注意这个位置对掉,可是索引是不会跟着走的),同时i自己加1(这个时候的i位置其实是之前对掉后的j号元素)
  5. 就这样不断遍历完列表内的所有元素,直到比pivot小的元素都被挪到了左边,并最终可以得到比pivot小的元素的最大序号+1(也就是有多少个比pivot小的元素,如果有10个,那序号就是10+1),把这个序号的元素和pivot对掉,那么得到的序列就是比pivot小的在左边,比pivot大的在右边。

我们试一下写伪代码

def quick_sort(array, low, high):
    #首先要分区,分区结束之后是得到pivot的索引,以及经过一次分区的一个array
    pivotindex=partition(array, low, high)
    quick_sort(array, low, pivotindex-1)
    quick_sort(array, pivotindex+1, high)

partition(array, low, high):
    i=low
    #初始化索引为中间值
    pivot_index=(low+high)/2
    swap(pivot_index, high)
    for j from low to high:
        if array[j]<=high:
            swap(i, j)
            i++
    swap(i, high)
    return i
end

具体代码实现

class  Solutions():
    def partition(array, low, high):
        pivot_index=(low+high)//2
        i=low
        swap(array, pivot_index, high)
        for j in range(low, high):
            if array[j]<=array[high]:
                swap(array, j, i)
                i=i+1
        swap(array, i, high)
        return i
    def quick_sort(array, low, high):
        if low>=high:
            return
        pivot_index=partition(array, low, high)
        quick_sort(array, low, pivot_index-1)
        quick_sort(array, pivot_index+1, high)
    def swap(array, i ,j)
        tmp=array[i]
        array[i]=array[j]
        array[j]=tmp
        return  
快速排序输出结果

冒泡排序

总体思路
遍历列表中的元素,每个元素都与下一个相邻元素相比较大小,如果当前元素大于下一个元素,那么就要对掉位置,所以大的元素就像冒泡一样不断冒到最右边。
时间复杂度:
要遍历列表的每个元素,对每个元素又要遍历所有的元素进行比较,最坏和平均的时间复杂度都是$O(N^{2})$。
写一下伪代码

bubble_sort(array, 0, high)
    for i from 0 to length(array)-1
        for j from 0 to length-i-1
         if array[j]>array[j+1]
             swap(j, j+1)
    end

代码如下

def swap(array, i, j):
    tmp=array[i]
    array[i]=array[j]
    array[j]=tmp
    return
def bubble_sort(array):
    for i in range(0, len(array)-1):
        for j in range(0, len(array)-i-1):
            if array[j]>array[j+1]:
                swap(array, j, j+1)
    return
bubble_sort(ran)
冒泡排序输出结果

在这里要注意冒泡排序遍历范围是从0到length(list)-1,最后一个没有比较的对象了。

选择排序

选择排序的总体思路:
遍历所有元素,当前元素所在位置i的左边是排好序的,右边是没有排序的,这一次遍历就是要从右边当中找到一个最小的元素,然后把这个元素与所在位置为i的元素位置互换。可以理解为不断地从右边没有排序的序列当中抽取出最小的值,然后跟当前元素i互换位置,这样左边依次是最小元素、次最小元素……这样的排列
时间复杂度:$O(N^{2})$
伪代码

for i from 0 to length(array)-1
    i=index
    for j from i to length(array)-1
        if array[j]<array[index]
            index=j
    if index not i
        swap(array, i, index)
end

代码如下

def selection_sort(array):
    for i in range(len(array)-1):
        index=i
        for j in range(i,len(array)-1):
            if array[j]<array[index]:
                index=j
        if index!=i:
            swap(array, i, index)
    return

输出结果

选择排序输出结果
今天总结了三种算法的实现,后续继续更新排序算法的详细介绍。关于几种排序算法的动画可以参考这里

相关文章

  • iOS算法总结-堆排序

    iOS算法总结-堆排序 iOS算法总结-堆排序

  • iOS算法总结-冒泡排序

    iOS算法总结-冒泡排序 iOS算法总结-冒泡排序

  • 浅谈排序算法

    排序算法有很多种,今天先谈谈一些简单的排序算法。包括桶排序、冒泡排序和快速排序算法。后期总结各种排序算法。 桶排序...

  • 算法学习(1)-排序算法

    八大排序算法九大排序算法再总结[经典排序算法][集锦][直观学习排序算法] 视觉直观感受若干常用排序算法 快速排序...

  • 面试常问的排序算法

    排序算法总结 排序是算法问题中的经典问题。为什么要总结排序算法呢?你懂的 : (假设所有的排序都是要求最终结果为:...

  • 排序算法

    一、排序算法总结 排序算法题目 排序算法快速排序堆排序归并排序 应用最小K个数(TopK问题)215.数组中的第K...

  • Swift的十大经典排序算法总结

    Swift的十大经典排序算法总结 排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排...

  • iOS + 常用排序算法

    算练习吧参照的原文常用排序算法总结(一)八大排序算法

  • 【算法-排序算法-基本排序算法】

    在快速排序算法总结的时候,介绍过基本排序算法包括选择排序、冒泡排序和插入排序。本章把他们三个放在一起总结一下 冒泡...

  • 一文搞定十大经典排序算法(Java实现)

    本文总结十大经典排序算法及变形,并提供Java实现。参考文章:十大经典排序算法总结(Java语言实现)快速排序算法...

网友评论

    本文标题:排序算法总结(一)

    本文链接:https://www.haomeiwen.com/subject/ajvrxftx.html