python算法

# 二分算法查找 時(shí)間復(fù)制度log(n)

def binary_search(list,item):

    row = 0

    high = len(list)-1

    while row <= high:
        mid = int((row + high) / 2)

        print('mid'+str(mid))

        guess = list[mid]

        if item == guess:
            return mid

        if item < guess:
            high = mid - 1

        else:
            row = mid + 1

    return None


if __name__ == '__main__':

    res = binary_search([1,3,4,5,7,9],4)

    print(res)
# 選擇排序 時(shí)間復(fù)雜度(O(n*n))

def find_smallest(arr):
    smallest_idx = 0

    smallest = arr[smallest_idx]

    for i in range(len(arr)):

        if arr[i] < smallest:

            smallest_idx = i

            smallest = arr[smallest_idx]


    return  smallest


def section_sort(arr):

    new_arr = []

    for i in range(len(arr)):

        smallest =  find_smallest(arr)

        arr.remove(smallest)

        new_arr.append(smallest)


    print(new_arr)



if __name__ == '__main__':

    section_sort([1,5,3,9])

# 快速排序  時(shí)間復(fù)雜度:O(nlog(n)) 分而治之

def quick_sort(arr):

    if len(arr) < 2:
        return arr

    else:
        pivot = arr[0]

        less = [i for i in arr[1:] if i <= pivot]

        greater = [i for i in arr[1:] if i> pivot]

        return quick_sort(less) + [pivot] +quick_sort(greater)


if __name__ == '__main__':

    new_arr = quick_sort([1,6,4,3])

    print(new_arr)


#單向鏈表

#在python當(dāng)中,所有的變量都是引用,也就是指針; a = 10,表示a 這個(gè)引用指向10這塊內(nèi)存;既然a 是引用,也可以去指向其他類型,如
# a= 'hello'

#在其他語言比如c語言當(dāng)中,int a = 10;這個(gè)a 是10這個(gè)內(nèi)存的別名;注意別名不是地址,比如我叫方煜逵,我的別名叫小方,但是我的地址是在員村XXX,你可以到員村XXX這個(gè)地址找到我,
#但是你到小方這個(gè)地址找到我,顯然很扯!所以別名說的還是10這塊內(nèi)存;故這塊內(nèi)存是int類型,就無法在存其他了類型了;當(dāng)然c語言引入指針類型int *b 來指向10這塊內(nèi)存

class SingleNode(object):

    def __init__(self,item):
        """單鏈表的結(jié)點(diǎn)"""

        # _item存放數(shù)據(jù)元素
        self.item = item
        # _next是下一個(gè)節(jié)點(diǎn)的標(biāo)識(shí)
        self.next = None


#單鏈表的實(shí)現(xiàn)
class SingleLinkList(object):

    def __init__(self,head = None):

        self.__head = head

    def is_empty(self):
        """判斷鏈表是否為空"""
        return self.__head == None

    def length(self):
        """鏈表長(zhǎng)度"""
        # cur初始時(shí)指向頭節(jié)點(diǎn)
        cur = self.__head
        count = 0
        # 尾節(jié)點(diǎn)指向None,當(dāng)未到達(dá)尾部時(shí)
        while cur != None:
            count += 1
            # 將cur后移一個(gè)節(jié)點(diǎn)
            cur = cur.next
        return count

    def travel(self):
        """遍歷鏈表"""
        cur = self.__head
        while cur != None:
            print(cur.item,end=' ')
            cur = cur.next
        print('')

    # 尾部添加元素
    def append(self,item):
        """尾部添加元素"""

        node = SingleNode(item)

        # 先判斷鏈表是否為空,若是空鏈表,則將_head指向新節(jié)點(diǎn)
        if self.is_empty():
            self.__head = node
        # 若不為空,則找到尾部,將尾節(jié)點(diǎn)的next指向新節(jié)點(diǎn)
        else:
            cur = self.__head

            while cur.next != None:
                cur = cur.next
            cur.next = node
    #頭部添加元素
    def add(self,item):
        """頭部添加元素"""
        node = SingleNode(item)
        node.next = self.__head
        self.__head = node

    def insert(self, pos, item):

        if pos <= 0:
            self.add(item)
        elif pos >=  self.length()-1:
            self.append(item)
        else:
            node = SingleNode(item)

            pre_cur = self.__head

            cur_pos = 0

            while cur_pos < pos-1:
                pre_cur = pre_cur.next

                cur_pos += 1

            node.next = pre_cur.next

            pre_cur.next = node

    def search(self, item):
        """鏈表查找節(jié)點(diǎn)是否存在,并返回True或者False"""

        cur = self.__head

        while cur!= None:
            if item == cur.item:
                return True
            else:
                cur = cur.next

        return False

    def remove(self, item):
        """刪除節(jié)點(diǎn)"""

        cur = self.__head

        pre = None
        
        while cur!= None:
            if item == cur.item:
                # 如果第一個(gè)就是刪除的節(jié)點(diǎn)
                if cur == self.__head:
                    # 將頭指針指向頭節(jié)點(diǎn)的后一個(gè)節(jié)點(diǎn)
                    self.__head = cur.next
                    cur = self.__head
                else:
                    pre.next = cur.next
                    pre = cur
                    cur = cur.next

            else:

                pre = cur

                cur = cur.next


if __name__ == '__main__':
     l = SingleLinkList()
     l.append(1)
     l.append(2)

     l.append(3)
     l.append(4)


     l.append(5)
     l.append(6)

     l.travel()



#單向循環(huán)鏈表

class SingleNode(object):

    def __init__(self,item):
        """單鏈表的結(jié)點(diǎn)"""

        # _item存放數(shù)據(jù)元素
        self.item = item
        # _next是下一個(gè)節(jié)點(diǎn)的標(biāo)識(shí)
        self.next = None


#單鏈表的實(shí)現(xiàn)
class SingleSycLinkList(object):

    def __init__(self,head = None):

        if head:
            self.__head = head
            head.next = self.__head
        else:
            self.__head = None

    def is_empty(self):
        """判斷鏈表是否為空"""
        return self.__head == None

    def length(self):
        """鏈表長(zhǎng)度"""
        # cur初始時(shí)指向頭節(jié)點(diǎn)
        cur = self.__head
        count = 1
        # 尾節(jié)點(diǎn)指向None,當(dāng)未到達(dá)尾部時(shí)
        while cur.next != self.__head:
            count += 1
            # 將cur后移一個(gè)節(jié)點(diǎn)
            cur = cur.next
        return count

    def travel(self):
        """遍歷鏈表"""
        if self.is_empty():
            return
        cur = self.__head

        while cur.next != self.__head:
            print(cur.item,end=' ')
            cur = cur.next
        print(cur.item, end=' ')

    # 尾部添加元素
    def append(self,item):
        """尾部添加元素"""

        node = SingleNode(item)

        # 先判斷鏈表是否為空,若是空鏈表,則將_head指向新節(jié)點(diǎn)
        if self.is_empty():
            self.__head = node
            node.next = self.__head
        # 若不為空,則找到尾部,將尾節(jié)點(diǎn)的next指向新節(jié)點(diǎn)
        else:
            cur = self.__head

            while cur.next != self.__head:
                cur = cur.next
            cur.next = node
            node.next = self.__head
    #頭部添加元素
    def add(self,item):
        """頭部添加元素"""

        node = SingleNode(item)

        if self.is_empty():
            self.append(item)
            return

        cur = self.__head
        while cur.next != self.__head:
            cur = cur.next

        node.next = self.__head

        cur.next = node

        self.__head = node

    def insert(self, pos, item):

        if pos <= 0:
            self.add(item)
        elif pos >=  self.length()-1:
            self.append(item)
        else:
            node = SingleNode(item)

            pre_cur = self.__head

            cur_pos = 0

            while cur_pos < pos-1:
                pre_cur = pre_cur.next

                cur_pos += 1

            node.next = pre_cur.next

            pre_cur.next = node

    def search(self, item):
        """鏈表查找節(jié)點(diǎn)是否存在,并返回True或者False"""
        if self.is_empty():
            return False

        cur = self.__head

        while cur.next!= self.__head:
            if item == cur.item:
                return True
            else:
                cur = cur.next
        if cur.item == item:
            return True
        return False

    def remove(self, item):
        """刪除節(jié)點(diǎn)"""

        if self.is_empty():
            return

        cur = self.__head

        pre = None



        while cur.next!= self.__head:
            if item == cur.item:
                # 如果第一個(gè)就是刪除的節(jié)點(diǎn)
                if cur == self.__head:
                    # 將頭指針指向頭節(jié)點(diǎn)的后一個(gè)節(jié)點(diǎn)
                    real = self.__head
                    while real.next != self.__head:
                        real = real.next

                    real.next = cur.next

                    self.__head = cur.next

                else:
                    pre.next = cur.next
                    pre = cur
                    cur = cur.next

            else:

                pre = cur

                cur = cur.next

        # real = self.__head
        # while real.next != self.__head:
        #     real = real.next
        if item == cur.item:
            pre.next = self.__head





if __name__ == '__main__':
     l = SingleSycLinkList()
     l.append(1)
     # l.append(2)
     # l.append(3)

     # #
     # l.add(0)
     # l.insert(1,2)
     # l.append(4)
     #
     #
     # l.append(5)
     # l.append(6)

     l.remove(1)



     l.travel()

#雙向鏈表

class Node(object):

    def __init__(self,item):
        self.item = item
        self.pre = None
        self.next = None


class DoubleLinkList(object):

    def __init__(self,node = None):
        self.__head = node

    def is_empty(self):
        """鏈表是否為空"""
        return self.__head == None

    def length(self):
        """鏈表長(zhǎng)度"""
        cur = self.__head
        count = 0
        while cur != None:
            cur = cur.next
            count += 1
        return count

    def travel(self):
        """遍歷鏈表"""
        cur = self.__head
        while cur!= None:
            print(cur.item,end=' ')
            cur = cur.next

        print('')

    def append(self,item):
        """鏈表尾部添加"""
        node = Node(item)
        if self.is_empty():
            self.__head = node

        else:
            cur = self.__head
            while cur.next != None:
                cur = cur.next
            cur.next = node
            node.pre = cur

    def add(self, item):
        """鏈表頭部添加"""
        node = Node(item)
        if self.is_empty():
            self.__head = node

        else:
            cur = self.__head
            node.next = cur
            cur.pre = node
            self.__head = node

    def insert(self,pos, item):
        """指定位置添加"""
        node = Node(item)
        if pos <=0:
            self.add(item)
        elif pos >= self.length()-1:
            self.append(item)
        else:
            cur = self.__head
            count = 0
            while count < pos:
                cur = cur.next
                count += 1
            cur.pre.next = node

            cur.pre = node

            node = cur.pre

            node.next = cur

    def search(self,item):
        """查找節(jié)點(diǎn)是否存在"""
        cur = self.__head
        while cur!=None:
            if cur.item == item:
                return True
            cur = cur.next
        return False

    def remove(self,item):
        """刪除節(jié)點(diǎn)"""
        if self.is_empty():
            return
        else:
            cur = self.__head

            while cur != None:
                if cur.item == item:
                    node_pre = cur.pre
                    node_next = cur.next
                    #當(dāng)刪除為首結(jié)點(diǎn)
                    if cur == self.__head:
                        self.__head = node_next
                        node_next.pre = None
                    # 當(dāng)刪除為尾結(jié)點(diǎn)
                    elif node_next == None:
                        cur.pre.next = None

                    else:
                        node_pre.next = node_next
                        node_next.pre = node_pre

                cur = cur.next


if __name__ == '__main__':
    dll = DoubleLinkList()
    dll.append(2)
    dll.append(3)
    dll.append(4)
    dll.append(5)
    dll.add(1)
    dll.insert(2,4)
    dll.remove(1)
    dll.travel()



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評(píng)論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評(píng)論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評(píng)論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,779評(píng)論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評(píng)論 1 330
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,287評(píng)論 0 291
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評(píng)論 1 338
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,515評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,750評(píng)論 1 375
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,933評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評(píng)論 1 296
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,492評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,703評(píng)論 2 380