炼气期算法(一)

1.插入排序算法

   假如你手中有一副扑克牌,假设是13张,现在你要整理它,你会怎么做?
   你可以这样做,假如你是左手拿牌,你把牌展开,牌的右边,你习惯放小的牌。
   一开始,将你手中的牌分成两部分,第一部分是你左手中最右边的那张牌,第二部分就是,剩下的牌,我们将这两
   个部分看作两个数组,很明显,第一个数组是排好序的,因为它只有一张牌,而第二个数组是乱序的。

插入排序,就是从未排序的数组中逐个取出,然后在已排好序的数组中找到自己的位置。

   拿你的牌来举例,你最右边的那张牌是属于已排序数组的,当前这个数组仅有一张牌,接下来,你要拿这张最右边 
   的旁边的那张牌出来,也就是从未排序的那12张牌中,从靠近最右边的方向开始取牌,然后与已排好序的牌比较,
   找到自己合适的位置。

   原理我们知道了,但怎么转化为算法呢?为了更好的理解,我们先用python伪代码来描述。
   算法伪代码如下:
   for j <—— 1 to len(arr)   # 遍历未排序数组
       do key <—— a[j]       # 逐一取出未排序数组元素
       i <—— j - 1           # 从两个数组的分界点处开始往牌的最右边遍历已排序数组
       while i >= 0 and A[i] > key  # 如果已排序数组还没遍历完而且已排序数组中的元素大于刚才取出的元素 这个也就是在已排序中找合适的位置
       do A[i+1] = A[i]      # 将key要放入的位置腾空出来 也就是将A[i]往后挪
          i <—— i - 1        #  继续遍历已排序的数组
       A[i+1] <—— key        # 将key插入到刚才腾空出来的位置

炼气期算法(一)_第1张图片

   好了,接下来用python来实现:
def insertSort(arr):
    for j in range(1, len(arr)):
        key = arr[j]
        i = j - 1
        while i >= 0 and arr[i] > key:
            arr[i+1] = arr[i]
            i = i - 1
        arr[i+1] = key
    return arr
  

一般考虑算法都是考虑上界,也就是最坏情况,当数组元素刚好逆序时,腾位置的操作就会这样:1+2+3+…+n = O(n^2) 可见这个算法并不算快

选择排序算法

   给你一个数组 [3,2,7,0,5], 如果不让你用上面说的插入排序,你会怎么排?

可以遍历整个数组,将最小的选出来,把它与第一个交换(假设我们做的是升序排序,从小到大),然后第一个别动了,在第二个到最后一个中,选出最小的,再与第二个交换,一直重复这个操作,直到遍历至数组的倒数第二
个数(因为最后只剩下两个数,一旦选出了一个,剩下的一个自然就定了)这就是选择排序算法。

   还是那个问题,像我这种才炼气的小白,很多时候原理知道了,但代码不知道怎么写。一句一句来翻译:
# 遍历数组寻找最小的,这个显然需要一个for循环 然而,得出来的这个最小的数还要与数组交换位置,要交换
#  的位置是数组的第一位,第二位,第三位... 这可以用一个for循环来记住 所以应该是这样的
for i in range(0, len(arr)-1):          # 用来记住要交换的位置
    for j in range(i, len(arr)):        # 因为交换好的位置不能动了 所以遍历数组寻找最小的操作应该要在i 到 len(arr)中进行
        # 内容

#  上面的内容应该是找出最小的那个数的操作 我只想找出最小的那个数,所以可以定义一个变量,如果小于这个变量的值,则将那个值赋给这个变量
for i in range(0, len(arr)-1):          # 用来记住要交换的位置
    key = arr[i]
    for j in range(i, len(arr)):        # 因为交换好的位置不能动了 所以遍历数组寻找最小的操作
        if arr[j] < key:
           key = arr[j]

#  这样是可以找到做小的值,但是等会的交换操作你不知道跟谁交换了,因为没有记住那个最小值的位置,当然
# 你可以另外用一个变量保存
def selectSort(arr):
    for i in  range(0, len(arr)-1):
        key = arr[i]
        minpos = -1
        for j in range(i, len(arr)):
            if key > arr[j]:
                key = arr[j]
                minpos = j 
        if minpos != -1:
            arr[i], arr[minpos] = key, arr[i]
    return arr

# 但更好的实现应该像下面一样,直接记住要交换的位置

def selectSort(arr):
    for i in  range(0, len(arr)-1):
        key = i
        for j in range(i, len(arr)):
            if arr[key] > arr[j]:
                key = j 
        arr[i], arr[key] = arr[key], arr[i]
    return arr 

炼气期的小白,修道艰难,请大家多多指教,共同进步!这个就先到这里了,饿屎了

你可能感兴趣的:(算法)