算法

冒泡算法:

  第一种

data_set = [9,7,54,12,52,12,1]

for j in range(len(data_set)):

  for i in range(len(data_set)-j-1):

    if data_set[i] > data_set[i+1]:

      tmp = data_set[i] 

      data_set[i] = data_set[i+1]

      data_set[i+1] = tmp

      #data_set[i],data_set[i+1] = data_set[i+1],data_set[i]   #可以把上面三行代码简化成一行

 

  第二种

a = [12,52,12,2,3,1]

for i in range(len(a)):

  for j in range(i+1,len(a)):

    if a[i] > a[j]:

    a[i],a[j] > a[j],a[i]

print(a)

 

 

 

 

堆排序

import time

import random

time_start = time.time()

data_set = [random.randrange(10000) for i in range(10000)]

for j in range(len(data_set),1,-1):

  for i in range(len(j/2-1),-1 -1):

    left_child_index = i*2 + 1

    right_child_index = left_child_index + 1

    left_child = data_set[left_child_index]

    if left_child > data_set[i]

      data_set[left_child_index],data_set[i] = data_set[i],data_set[left_child_index]

    if right_child_index < j:

      right_child = data_set[right_child_index]

      if right_child > data_set[i]:

        data_set[right_child_index],data_set[i] = data_set[i],data_set[right_child_index]

  data_set[0],data_set[j-1] = data_set[j-1],data_set[0]

print(time.time()-time_start,data_set)

 

 

希尔

import time

import random

data_set = [random.randrange(10000) for i in range(10000)]

step = int(len(data_set)/2)

while step >=1:

  for i in range(len(data_set)-step):

    if data__set[i] > data_set[i+step]:

      data_set[i],data_set[i+step] = data_set[i+step],data_set[i]

    step = int(step/2)

else:

  for i in range(len(data_set)):

    while i > 0 and data_set[i] < data_set[i-1]:

      temp = data_set[i]

      data_set[i] = data_set[i-1]

      data_set[i-1] = temp

      i -= 1

  time = time.time()

print(data_set,time)

 

快排

data_list = [12,21,52,12,23,254,1,2,3,-9]

def quick_sort(data_list,left,right):

  if left >= right:

    return data_list

  key = data_list[left]

  low = left

  high = right

  while left < right:

    while left < right and data_list[right] >= key:

      right -= 1

    data_list[left] = data_list[right]

    while left < right and data_list[left] <= key:

      left += 1

     data_list[right] = data_list[left]

  data_list[right] = key

  quick_sort(data_list,low,left - 1)

  quick_sort(data_list,left + 1,high)

  return data_list

if __name__ == '__main__':

  quick_sort(data_list,0,len(data_list)-1)

  print(data_list)

 

 

 

def quick_sort(array,left,right):

  """

   :param array:

   :param left: 列表的第一个索引

:param right: 列表最后一个元素的索引
:return:

  """

  if left >= right:

    return 

  low = left

  high = right

  key = array[low]        #第一个值

  while low < high:           #只要左右未遇见

    while low < high and array[high] > key:    #找到列表右边比key大的值为止

      high -= 1

    array[low] = array[high]       #此时直接把key(array[low])          跟比它大的array[high]进行交换

    array[high] = key

    while low < high and array[low] < key:     #找到key左边比key大的值,这里为何是<=而不是<呢?你要思考...

      low += 1

    array[high] = array[low]      #找到了左边比k大的值,把array[high](此时应该刚存成了key)跟这个比key大的array[low]进行调换

    array[low] = key

  quick_sort(array,left,low-1)      #最后用同样的方式对分出来的左边的小组进行同行的做法

  quick_sort(array,low+1,right)     #用同样的方式对分出来的右边的小组进行同上的做法

if __name__ == '__main__':

  array = [

96, 14, 10, 9, 6, 99, 16, 5, 1, 3, 2, 4, 1, -123, -876, 13, 26, 18, 2, 45, 34, 23, 1, 7, 3, 22, 19, 2

]

  print("before sort:",array)

  quick_sort(array,0,len(array)-1)

  print("------final------")

  print(array)

 

插入

data_list = [34,12,42,11,52,41,2,12,42,1,245,-9,52,12,42,112,52,12]

第一种方法:

for i in range(len(datta_list)):

  while i > 0 and data_list[i] < data_list[i - 1]:

    tmp = data_list[i]

    data_list[i] = data_list[i - 1]

    data_list[i - 1] = tmp

    i -= 1

  print(data_list)

print(data_list)

 

第二种方法:

for i in range(1,len(data_list)):

  key = data_list[i]

  for j in range(i-1,-1,-1):

    if data_list[j] > key:

      data_list[j + 1] = data_list[j]

      data_list[j] = key

print(data_list)

 

第三种方法:

count = len(data_list)

for i in range(1,count):

  key = data_list[i]

  j = i - 1

  while j >= 0:

    if data_list[j] > key:

      data_list[j + 1] = data_list[j]

      data_list[j] = key

    j -= 1

print(data_list)

 

 

chaoru_list = [51,2,142,21,41,21,21,44,5,1255,4212,554,22,541,-5,124]

def handler(array):

  for i in range(1,len(array)):

    position = i #刚开始往左边走的第一个位置

    current_val = array[i]   #先把当前值存下来

    while position > 0 and current_val < array[position - 1]:

      '''

      这里为什用while循环,咋们先判断左边的值的时候知道他有多少个值么?不知道,所以用 while循环什么时候停下来呢?当左边没有值得时候,或者当他大于左边的值得时候

      '''

      array[position] = array[position - 1]      #如果while条件成立把当前的值替换为他上一个值

      """

      比如一个列表:

      [3,2,4,1]

      现在循环到1了,他前面的元素已经循环完了

      [2,3,4]1

      首先我们记录下当前这个position的值 = 1

      [2,3,4,4]这样,就出一个位置了

      在对比前面的3,1比小3小

      [2,3,3,4]在替换一下他们的值

      在对比2

      [2,2,3,4]

      最后while不执行了在进行替换'array[position] = current_val     #把值替换'

      """

      position -= 1

        #当上面的条件都不成立的时候{左边没有值/做边的值不比自己的值小}

       array[position] = current_val       #把值替换

if __name__ == '__main__':

  handler(chaoru_list)

  print(chaoru_list)

 

选择

data_list = [32,12,42,15,42,15,42,15,414,-9]

第一种方法:

for k in range(len(data_list)):

  set_len_index = k

  for i in range(k,len(data_list))

    if data_list[i] < data_lisst[set_len_index]:

      set_len_index = i

  tmp = data_list[set_len_index]

  data_list[set_len_index] = data_list[k]

  data_list[k] = tmp

  print(data_list)s

print(data_list)

 

第二种方法

count = len(data_list)

for i in range(0,count):

  min = i

  for j in range(i + 1,count):

    if data_list[min] > data_list[j]:

      min = j

  data_list[min],data_list[i] = data_list[i],data_list[min]

print(data_list)

         

    

posted @ 2016-10-09 21:19  WrYcF  阅读(85)  评论(0)    收藏  举报
Live2D