排序代碼(python,c++) 及 基本算法復雜度

0.導語

本節為手撕代碼系列之第一彈,主要來手撕排序算法,主要包括以下幾大排序算法:

  • 直接插入排序

  • 冒泡排序

  • 選擇排序

  • 快速排序

  • 希爾排序

  • 堆排序

  • 歸并排序

1.直接插入排序

算法思想

每一步將一個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。

代碼實現

# 直接插入排序
def insert_sort(arr):length = len(arr)for i in range(length):k = ifor j in range(k,0,-1):if arr[j]<arr[j-1]:t = arr[j]arr[j]=arr[j-1]arr[j-1]=t
arr = [4,3,0,-1]
insert_sort(arr)
print(arr)

2.冒泡排序

算法思想

對相鄰的元素進行兩兩比較,順序相反則進行交換,這樣,每一趟會將最小或最大的元素“浮”到頂端,最終達到完全有序。

代碼實現

# 冒泡排序
def bubbleSort(arr):length = len(arr)for i in range(length-1):flag = Truefor j in range(length-i-1):if arr[j]>arr[j+1]:t = arr[j]arr[j]=arr[j+1]arr[j+1]=tflag = Falseif flag:break
arr = [6,-2,0,9]
bubbleSort(arr)
print(arr)

3.選擇排序

算法思想

每一趟從待排序的數據元素中選擇最小(或最大)的一個元素作為首元素,直到所有元素排完為止,簡單選擇排序是不穩定排序

代碼實現

def selectSort(arr):length = len(arr)for i in range(length-1):min = ifor j in range(i+1,length):if arr[min]>arr[j]:min=jif min!=i:t = arr[i]arr[i]=arr[min]arr[min]=t
arr = [6,-2,0,9]
selectSort(arr)
print(arr)

4.快速排序

算法思想

快速排序思想----分治法。

  • 先從數列中取出一個數作為基準數。

  • 分區過程,將比這個數大的數全放到它的右邊,小于或等于它的數全放到它的左邊。

  • 再對左右區間重復第二步,直到各區間只有一個數。

每次劃分得到,樞椎的左邊比它小,右邊比它大。

代碼實現

方法一(通過遍歷直接得到大于pivot和小于pivot的元素):

class Solution:def quicksort(self, array):""":type numRows: int:rtype: List[List[int]]"""if len(array)<=1:return arrayelse:pivot=array[0]small=[i for i in array[1:] if i<=pivot]big=[i for i in array[1:] if i >pivot]return self.quicksort(small)+[pivot]+self.quicksort(big)  //遞歸法,耗時

?方法二(雙指針前后移動):

def quickSort(arr,left,right):# 遞歸終止條件if left>right:returnpivot = arr[left]i = leftj = rightwhile i<j:while i<j and arr[j]>=pivot:j-=1while i<j and arr[i]<=pivot:i+=1if i<j:t = arr[i]arr[i] = arr[j]arr[j] = t# 放入樞椎arr[left] = arr[i]arr[i]=pivot# 遞歸調用左區域quickSort(arr,left,i-1)# 遞歸調用右區域quickSort(arr,i+1,right)arr = [6,-2,0,9]
quickSort(arr,0,len(arr)-1)
print(arr)

5.希爾排序

算法思想

該算法也被稱為:縮小增量排序

希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個文件恰被分成一組,算法便終止。

代碼實現

# 希爾排序
def shellSort(arr):length =  len(arr)# 設置初始增量gap = length//2while gap>0:# 從第gap個元素,逐個對其所在組進行直接插入排序for i in range(gap,length):j = iwhile j-gap>=0 and arr[j]<arr[j-gap]:t = arr[j]arr[j] = arr[j-gap]arr[j-gap] = tj-=gapgap//=2
arr = [6,-2,0,9]
shellSort(arr)
print(arr)

6.堆排序

算法思想

堆是具有以下性質的完全二叉樹:每個結點的值都大于或等于其左右孩子結點的值,稱為大頂堆;或者每個結點的值都小于或等于其左右孩子結點的值,稱為小頂堆。

基本思路:

  a.將無需序列構建成一個堆,根據升序降序需求選擇大頂堆或小頂堆;

  b.將堆頂元素與末尾元素交換,將最大元素"沉"到數組末端;(升序方法)

  c.重新調整結構,使其滿足堆定義,然后繼續交換堆頂元素與當前末尾元素,反復執行調整+交換步驟,直到整個序列有序。

代碼實現

方法1:

class HeapSort:def heapSort(self, nums):length = len(nums)# 從后往前遍歷,交換堆頂與最后葉子節點,并依次調整堆,重復操作for j in range(length-1,0,-1):# 獲取堆頂元素(獲取同時,調整堆)firstNum = self.adjustHeap(nums,j+1)# 交換最后一個葉子節點與堆頂元素temp = nums[j]nums[j] = firstNumnums[0] = tempreturn nums# 調整堆(最大堆),每次返回最大堆頂元素def adjustHeap(self,nums,length):# 最后一個非葉節點i = length//2 -1# 從最后一個非葉節點開始調整,構成最大堆while i>=0:temp = nums[i]k = 2*i+1while k<length:if k+1<length and nums[k]<nums[k+1]:k+=1if nums[k]>temp:nums[i]=nums[k]i=kelse:breakk=2*k+1nums[i] = tempi-=1return nums[0]
s = HeapSort()
nums = [8,9,7,10]
t = s.heapSort(nums)
print(t)

方法2:

def buildMaxHeap(self,arr):import mathfor i in range(math.floor(len(arr) / 2), -1, -1):self.heapify(arr, i)def heapify(self, arr, i):left = 2 * i + 1right = 2 * i + 2largest = iif left < arrLen and arr[left] > arr[largest]:largest = leftif right < arrLen and arr[right] > arr[largest]:largest = rightif largest != i:self.swap(arr, i, largest)self.heapify(arr, largest)def swap(self, arr, i, j):arr[i], arr[j] = arr[j], arr[i]def heapSort(self, arr):global arrLenarrLen = len(arr)self.buildMaxHeap(arr)for i in range(len(arr) - 1, 0, -1):self.swap(arr, 0, i)arrLen -= 1self.heapify(arr, 0)return arr

7.歸并排序

算法思想

歸并排序是利用歸并的思想實現的排序方法,該算法采用經典的分治策略(分治法將問題(divide)成一些小的問題然后遞歸求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。

代碼實現

import math
class Solution:def mergeSort(self,arr):if (len(arr) < 2):return arrmiddle = math.floor(len(arr) / 2)left, right = arr[0:middle], arr[middle:]return self.merge(self.mergeSort(left), self.mergeSort(right))def merge(self,left, right):result = []while left and right:if left[0] <= right[0]:result.append(left.pop(0));else:result.append(right.pop(0));while left:result.append(left.pop(0));while right:result.append(right.pop(0));return result

?來自于wx公眾號“光城”。

?

幾種排序算法代碼c++版本 (暫無堆排和希爾排序):

#include "../stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include<functional>
#include <map>
#include <iostream>
using namespace std;void BubbleSort(vector<int> &arr){if (arr.size() <= 0)return;for (int len = arr.size() - 1; len >= 1; len--){for (int i = 0; i < len; i++){if (arr[i]>arr[i + 1])swap(arr[i], arr[i + 1]);}}
}void SelectionSort(vector<int> &arr){if (arr.size() <= 0)return;for (int i = 0; i < arr.size() - 1; i++){int min_index = i;for (int j = i + 1; j < arr.size(); j++){/*if (arr[j]<arr[j-1])    //每次左邊起始位置向前移一個,但是并不能保證一輪下來,左邊的數為最小值swap(arr[j-1], arr[j]);*/min_index = arr[min_index] < arr[j] ? min_index : j;}swap(arr[min_index],arr[i]);}
}void InsertSort(vector<int> &arr){if (arr.size() <= 0)return;for (int i = 1; i < arr.size(); i++){ //從索引1開始,前面索引0區域為插入空間for (int j = i - 1; j >= 0 && arr[j]>arr[j + 1]; j--) //--逆序(直接和插入空間最右(也即最大)的數比較,就可知是否進行插入)swap(arr[j], arr[j + 1]); //不是i,j直接比較    j--決定插入的具體位置,如(1,3,5)2
    }
}void QuickSort(vector<int> &arr,int L, int R){if (L >= R) //遞歸終止條件return;int pivot = arr[L];int i = L, j = R;while (i != j){//先從右邊找,否則會報錯while (arr[j] > pivot&&i < j)j--;while (arr[i] <= pivot&&i < j)i++;if (i < j){swap(arr[i],arr[j]);}}arr[L] = arr[i];arr[i] = pivot; //最終pivot位置為iQuickSort(arr, L, i - 1);QuickSort(arr, i + 1,R);
}//歸并:先拆分為若干子數組,通過merge()對其逐步合并排序
void Merge(vector<int> &arr, int L, int mid, int R){int i = L, j = mid + 1;vector<int> new_arr;while (i <= mid&&j <= R){if (arr[i] <= arr[j])new_arr.push_back(arr[i]),i++;elsenew_arr.push_back(arr[j]),j++;}while (i <= mid)new_arr.push_back(arr[i]), i++;while (j <= R)new_arr.push_back(arr[j]), j++;for (int k = L, t = 0; k <= R; k++, t++) //把值復制回原arrarr[k] = new_arr[t];
}void MergeSort(vector<int> &arr, int L, int R){if (L >= R)return;else{int mid = (L + R) / 2;MergeSort(arr, L, mid);MergeSort(arr, mid + 1, R);Merge(arr, L, mid, R);}
}int main(void){vector<int> array = {2, 1, 3, 5, 2, 6, 9, 2, 7 };//BubbleSort(array);//SelectionSort(array);//InsertSort(array);//QuickSort(array, 0, array.size() - 1);MergeSort(array, 0, array.size() - 1);vector<int> vec = array;vector <int>::iterator it;for (it = vec.begin(); it != vec.end();it++)cout << *it << endl;getchar();return 0;
}

?

?

基本算法復雜度:

參考來源:https://linux.cn/article-7480-1.html

?

?

轉載于:https://www.cnblogs.com/nicetoseeyou/p/10512700.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449679.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449679.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449679.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TCP/IP四層模型與OSI參考模型

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 TCP/IP四層模型&#xff1a; 1.鏈路層&#xff08;數據鏈路層/網絡接口層&#xff09;&#xff1a;包括操作系統中的設備驅動程序、計算…

Metal日記:使用步驟指南

本文參考資料&#xff1a; juejin.im/post/5b1e8f… xiaozhuanlan.com/topic/04598… developer.apple.com/videos/play… github.com/quinn0809/G… cloud.tencent.com/developer/a… devstreaming-cdn.apple.com/videos/wwdc… Metal處理邏輯 無論是CoreImage、GPUImage框架&…

還駕馭不了4核? 別人已模擬出百萬核心上的并行

摘要&#xff1a;不管是臺式機還是筆記本&#xff0c;四核雙核都已經不是新鮮的事了。計算機領域的你可能已經認識到了給電腦選配4核的處理器完全是一種浪費&#xff0c;因為大多數的程序都不支持多核心的并行處理。然而斯坦福的計算機科學家最近公布&#xff0c;他們已經模擬出…

docker安裝并運行ubuntu

拉取鏡像 docker pull dorowu/ubuntu-desktop-lxde-vnc 運行容器&#xff1a; docker run -p 6080:80 dorowu/ubuntu-desktop-lxde-vnc 之后就可以http://localhost:6080/

Django內置權限擴展案例

當Django的內置權限無法滿足需求的時候就自己擴展吧~ 背景介紹 overmind項目使用了Django內置的權限系統&#xff0c;Django內置權限系統基于model層做控制&#xff0c;新的model創建后會默認新建三個權限&#xff0c;分別為&#xff1a;add、change、delete&#xff0c;如果給…

Java 從入門到高級學習路線

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Java 從入門到高級學習路線《一》1.Jvm 部分Jvm 內存模型、Jvm 內存結構、Jvm 參數調優、Java 垃圾回收《二》Java 基礎部分1.必須會使用…

Flutter Mac iOS 環境配置

官方文檔&#xff1a;flutter.io/docs/get-st… 1.需要的命令行工具 bash curl git 2.x mkdir rm unzip which 2.SDK下載地址 flutter_macos_v1.0.0-stable.zip storage.googleapis.com/flutter_inf… 3.解壓Flutter SDK cd ~/Flutter/SDK $ unzip ~/Downloads/flutter_macos_v…

多線程研究1

單線程&#xff1a; from urllib.request import urlretrieve import time import random starttime.time() fopen(E:\Python\py\web\hh.txt,r)#打開存放URL的文件 af.readlines() f.close() for i in a:brandom.randint(0,30)urlretrieve(i,%d.png%b) endtime.time() print(…

android viewpage預加載和懶加載問題

1、本人理解懶加載和預加載問題某種情況下可以歸結為一類問題&#xff0c;下面我就說一下我遇到的預加載問題和懶加載問題及解決的相應方法&#xff1a; - [1 ] 預加載問題 描述&#xff1a;我用到了三個fragment、viewpage及tablayout實現點擊切換、滑動切換。 …

大數據,且行且思

“大數據”概念于20世紀90年代被提出&#xff0c;最初只是對一些在一定時間內無法用傳統方法進行抓取、管理和處理的數據的統稱。隨著時間的推移和科技的發展以及物聯網、移動互聯網、SNS的興起&#xff0c;每年產生的數據量都以幾何級數增長&#xff0c;《IDC Digital Univers…

IntelliJ IDEA中新建JAVA WEB項目、maven項目

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 在IntelliJ IDEA 中新建一個Web應用項目。 1、 在主界面頂部菜單欄依次“File”-"New"-"Project..." 2、在對話框中…

S/4HANA業務角色概覽之訂單到收款篇

2019獨角獸企業重金招聘Python工程師標準>>> 大家好我叫Sean Zhang&#xff0c;中文名張正永。目前在S/4HANA產品研發部門任職產品經理&#xff0c;而這一階段要從2017年算起&#xff0c;而在那之前接觸更多還是技術類的&#xff0c;比如做過iOS、HANA、ABAP、UI5等…

掘金量化的一個代碼,對本人寫策略避免入坑有重要意義

# codingutf-8from __future__ import print_function, absolute_import, unicode_literalsfrom gm.api import *import numpy as npdef init(context):# 選擇的兩個合約context.symbol [DCE.j1901, DCE.jm1901]# 訂閱歷史數據subscribe(symbolscontext.symbol,frequency1d,co…

C++ STL學習筆記

C STL學習筆記一 為何要學習STL&#xff1a; 數據結構與算法是編程的核心&#xff0c;STL中包含各種數據結構和優秀的算法&#xff0c;確實值得深入學習&#xff0c;本文中雖然著重使用&#xff0c;但希望有心的朋友能多看看相關數據結構的實現&#xff0c;對于C語言確實會有較…

ItelliJ IDEA開發工具使用—創建一個web項目

轉自&#xff1a;https://blog.csdn.net/wangyang1354/article/details/50452806概念需要明確一下IDEA中的項目&#xff08;project&#xff09;與eclipse中的項目&#xff08;project&#xff09;是不同的概念&#xff0c;IDEA的project 相當于之前eclipse的workspace,IDEA的M…

AKOJ-2037-出行方案

鏈接&#xff1a;https://oj.ahstu.cc/JudgeOnline/problem.php?id2037 題意&#xff1a; 安科的夏天真是不一般的熱&#xff0c;避免炎熱&#xff0c;伍學長因此想為自己規劃一個校園出行方案&#xff0c;使得從宿舍出發到校園的各個地方距離花費時間最短。我們已知校園一共有…

akshare 布林通道策略

import datetime import pandas as pd import backtrader as bt import matplotlib.pyplot as plt from datetime import datetime import matplotlib import akshare as ak %matplotlib inline class Boll_strategy(bt.Strategy):#自定義參數&#xff0c;每次買入1800手param…

一些資源網站..

github上各種免費編程書籍~~~ : https://github.com/EbookFoundation/free-programming-books/blob/master/free-programming-books-zh.md正則表達式學習 :https://web.archive.org/web/20161119141236/http://deerchao.net:80/tutorials/regex/regex.htmtorch&#xff1a;http…

極客無極限 一行HTML5代碼引發的創意大爆炸

摘要&#xff1a;一行HTML5代碼能做什么&#xff1f;國外開發者Jose Jesus Perez Aguinaga寫了一行HTML5代碼的文本編輯器。這件事在分享到Code Wall、Hacker News之后&#xff0c;引起了眾多開發者的注意&#xff0c;紛紛發表了自己的創意。 這是最初的HTML5代碼&#xff0c;它…

c# 寫文件注意問題及用例展示

以txt寫string舉例&#xff0c;正確代碼如下&#xff1a; private void xie(){FileStream fs new FileStream("1.txt", FileMode.Create);StreamWriter sw new StreamWriter(fs, Encoding.Default);sw.Write("123");sw.Flush();sw.Close();//fs.Flush();…