排序算法2019-05-05

2019-05-05  本文已影响0人  swagsmile

今天晚上的任务。
排序算法!!
1, 冒泡排序!
2,选择排序
3,插入排序
4,希尔排序
5,合并排序
6,快速排序。
7,堆排序
冒泡排序时间复杂度为n的平方,两层循环嵌套,每一次把最大的放在最后面。如前面的比后面的大,则交换。
选择排序是冒泡排序的升级版,比较次数没有变,减少了交换次数。每一次找到最大的值所在的位置,和序列的最后一个元素交换。也是两层循环。
插入排序也是两层循环,每次最外圈循环完成后,有序的子序列的长度都加1,直到整个序列为有序序列。若前面的比当前要插入的值要大,则把前面的值往后移动一位,直到找到要插入元素的位置。
循环语句有for循环和while循环。熟悉这两种语句的应用 场景,两种语句之间的转化。
合并排序:利用分治法的思想,递归地把序列分为左右两个部分,直到序列中只含有一个元素,若序列只含有一个元素,则这个序列肯定为有序序列。再对有序的子序列进行合并为有序的较大子序列,直到整个序列为有序序列。
快速排序:同样利用分治法的思想。首先选取序列中的第一个元素为中枢值,把这个中枢值放在序列中合适的位置(左边部分都比中枢值小,右边部分都比中枢值大),再分别对左右两部分子序列进行和该序列同样地操作,即快速排序。

冒泡排序
def bubbleSort(alist):
    for passnum in range(len(alist)-1,0,-1):
        for i in range(passnum):
            if alist[i]>alist[i+1]:
                temp = alist[i]
                alist[i] = alist[i+1]
                alist[i+1] = temp

alist = [54,26,93,17,77,31,44,55,20]
bubbleSort(alist)
print(alist)


def shortBubbleSort(alist):
    exchanges = True
    passnum = len(alist)-1
    while passnum > 0 and exchanges:
       exchanges = False
       for i in range(passnum):
           if alist[i]>alist[i+1]:
               exchanges = True
               temp = alist[i]
               alist[i] = alist[i+1]
               alist[i+1] = temp
       passnum = passnum-1

alist=[20,30,40,90,50,60,70,80,100,110]
shortBubbleSort(alist)
print(alist)


选择排序
def selectionSort(alist):
   for fillslot in range(len(alist)-1,0,-1):
       positionOfMax=0
       for location in range(1,fillslot+1):
           if alist[location]>alist[positionOfMax]:
               positionOfMax = location

       temp = alist[fillslot]
       alist[fillslot] = alist[positionOfMax]
       alist[positionOfMax] = temp

alist = [54,26,93,17,77,31,44,55,20]
selectionSort(alist)
print(alist)


插入排序
def insertionSort(alist):
   for index in range(1,len(alist)):

     currentvalue = alist[index]
     position = index

     while position>0 and alist[position-1]>currentvalue:
         alist[position]=alist[position-1]
         position = position-1

     alist[position]=currentvalue

alist = [54,26,93,17,77,31,44,55,20]
insertionSort(alist)
print(alist)

另起一段:

合并排序
def mergeSort(alist):
    print("Splitting ",alist)
    if len(alist)>1:
        mid = len(alist)//2
        lefthalf = alist[:mid]
        righthalf = alist[mid:]

        mergeSort(lefthalf)
        mergeSort(righthalf)

        i=0
        j=0
        k=0
        while i < len(lefthalf) and j < len(righthalf):
            if lefthalf[i] <= righthalf[j]:
                alist[k]=lefthalf[i]
                i=i+1
            else:
                alist[k]=righthalf[j]
                j=j+1
            k=k+1

        while i < len(lefthalf):
            alist[k]=lefthalf[i]
            i=i+1
            k=k+1

        while j < len(righthalf):
            alist[k]=righthalf[j]
            j=j+1
            k=k+1
    print("Merging ",alist)

alist = [54,26,93,17,77,31,44,55,20]
mergeSort(alist)
print(alist)

快速排序
def quickSort(alist):
   quickSortHelper(alist,0,len(alist)-1)

def quickSortHelper(alist,first,last):
   if first<last:

       splitpoint = partition(alist,first,last)

       quickSortHelper(alist,first,splitpoint-1)
       quickSortHelper(alist,splitpoint+1,last)


def partition(alist,first,last):
   pivotvalue = alist[first]

   leftmark = first+1
   rightmark = last

   done = False
   while not done:

       while leftmark <= rightmark and alist[leftmark] <= pivotvalue:
           leftmark = leftmark + 1

       while alist[rightmark] >= pivotvalue and rightmark >= leftmark:
           rightmark = rightmark -1

       if rightmark < leftmark:
           done = True
       else:
           temp = alist[leftmark]
           alist[leftmark] = alist[rightmark]
           alist[rightmark] = temp

   temp = alist[first]
   alist[first] = alist[rightmark]
   alist[rightmark] = temp


   return rightmark

alist = [54,26,93,17,77,31,44,55,20]
quickSort(alist)
print(alist)
上一篇 下一篇

猜你喜欢

热点阅读