1. 程式人生 > >排序虛擬碼總結

排序虛擬碼總結

目錄

演算法

演算法

演算法

一.選擇排序

時間複雜度為Θ(n²)

演算法

輸入:n個元素的陣列A[1...n]

輸出:按非降序排列的陣列A[1...n]

  1. for  i←1 to n-1
  2.        k←i       //設立標誌位
  3.        for j←i+1 to n     //查詢第i小的元素
  4.             if A[j]<A[k]    then k←j
  5.        end for
  6.        if k≠i    then 交換A[i]與A[k]
  7. end for

操作方法:首先找到最小元素,將其存放在A[1]中,然後找到剩下的n-1個元素中的最小元素,將其存放在A[2]中,重複此過程直至找到第二大的元素,並將其存放在A[n-1]中

二.插入排序

演算法

輸入:n個元素的陣列A[1...n]

輸出:按非降序排列的陣列A[1...n]

  1. for i←2 to n
  2.      x←A[i]
  3.      j←i-1
  4.      while(j>0) and (A[j]>x)
  5.               A[j+1]←A[j]
  6.               j←j-1
  7.      end while
  8.      A[j+1]←x
  9. end for

操作方法:在第i次插入中,要將A[i]插入到已排序的子陣列A[1...n-1]中的合適位置上,依次掃描序號從i-1到1的元素,每次都將A[i]和當前位置的元素比較,在掃描的每一步,元素A[1...i-1]大於A[i]都被移到序號更高的一個位置上,然後在合適的位置上插入A[i]

三.快速排序(分治法)

時間複雜度為Θ(n*logn)空間複雜度為Θ(n)

輸入:陣列A[]low...high]

輸出:(1)如有必要,輸出按上述描述的重新排列的陣列A

          (2)劃分元素A[low]的新位置w

split演算法

  1. i←low
  2. x←A[low]     //第一位的元素
  3. for j←low+1 to high    //遍歷陣列中剩下所有元素
  4.      if A[j]≤x    then
  5.         i←i+1   //用i指標來從第二個元素開始交換新增較小的元素
  6.         if i≠j    then 互換A[i]和A[j]
  7.      end if 
  8. end for
  9. 互換A[low]和A[i]
  10. w←i
  11. return A和w

 操作方法:用i指標和j指標交換元素,當演算法對所有元素掃描後,用A[i]與主元交換,這樣所有小於或等於主元的元素處於它的左邊,並且所有大於主元的元素處於它的右邊,最後演算法將i賦給主元的位置w

quicksort演算法

輸入:n個元素的陣列A[1...n]

輸出:按非降序排列的陣列A[1...n]

quicksort(A,low,high)

  1. if low<high    then
  2.     SPLIT(A[low...high],w)    //w為A[low]的新位置
  3.     quicksort(A,low,w-1)
  4.     quicksort(A,w+1,high)
  5. end if

操作方法:子陣列A[low...w-1]和A[w+1,high)遞迴地排序

四.歸併排序(分治法)

時間複雜度為Θ(n*logn)空間複雜度為Θ(n)

演算法

輸入:n個元素的陣列A[1...n]

輸出:按非降序排列的陣列A[1...n]

mergesort(A,1,n)

過程:mergesort(low,high)

  1. if low<high    then
  2.    mid←⌊(low+high)/2⌋
  3.    mergesort(A,low,mid)
  4.    mergesort(A,mid+1,high)
  5.    MERGE(A,low,mid,high)
  6. end if

合併兩個有序的表

輸入:陣列A[1...m]和它的三個索引p,q,r,1≤p≤q≤r≤m,兩個子陣列A[p...q]和A[q+1...r]各自按升序排列

輸出:合併兩個子陣列A[p...q]和A[q+1...r]的陣列A[p...r]

MERGE

  1. //B[p...r]是個輔助陣列
  2. s←p;t←q+1;k←p
  3. while s≤q and t≤r
  4.          if A[s]≤A[t]    then
  5.             B[k]←A[s]
  6.             s←s+1
  7.          else
  8.             B[k]←A[t]
  9.             t←t+1
  10.          end if
  11.          k←k+1
  12. end while
  13. if s=q+1    then B[k...r]←A[t...r]
  14. else B[k...r]←A[s...q]
  15. end if
  16. A[p...r]←B[p...r]

相關推薦

排序虛擬總結

目錄 演算法 演算法 演算法 一.選擇排序 時間複雜度為Θ(n²) 演算法 輸入:n個元素的陣列A[1...n] 輸出:按非降序排列的陣列A[1...n] for  i←1 to n-1        k←i       //設

演算法導論堆排序虛擬(學習筆記)

MAX-HEAPIFY 遞迴虛擬碼:   時間複雜度為 lg(n) 底數為2 , 維護最大堆性質的關鍵 MAX-HEAPIFY(A, i): //維護堆性質的關鍵, 用於檢測是否滿足堆的性質 l = left(i); r = right(i);

插入排序(虛擬)

INSERTION_SORT(A)1.for j=2 to A.length2.    key=A[j]3.    i=j-1;4.    while i>0 and A[j]>key 5.       A[i+1]=A[i] 6.       i=i-17. 

虛擬演算法之快速排序(分治排序

開始的地方應該有個標題 我目前認為:名字不應該僅僅是一個符號,如果可以的話,應該能達到某種程度的“顧名思義”。 所以,我認為,應該叫做分治排序。 所以,你應該先知道什麼是“分治”。顧名思義,分治就是“分而治之”。為了減少知識的耦合,這裡並不詳細介紹“分治”

《演算法導論》第七章-快速排序虛擬

快速排序 虛擬碼:  QuickSort(A,p,r)        if p<r             q = Partition(A,p,r)    //確定劃分位置          

歸併排序演算法的虛擬和實現

虛擬碼 MERGE(A,p,q,r) n1=q-p+1; n2=r-q; create new arrays L[n1+1] and R[n2+1] for i=0 to n1-1 L[i]=A[p+i]

排序演算法虛擬

// 草稿,待完善 ///////////////////////////////////////////////////// void HeapSort( 陣列,元素個數) {     BuildHeap( 陣列,堆大小); // 大小就是包含的元素個數   

快速排序:原始碼(C++)--虛擬--時間複雜度解析

namespace htx{ //////////////////1.快速排序//////////////////////// //<1>原始碼 <2>虛擬碼 <

關於排序演算法的一點知識——例項和虛擬

1. 插入排序        將待排序的資料分成兩個區域:有序區和無序區,每次將一個無序區中的資料按其大小插入到有序區中的適當位置,直到所有無序區中的資料都插入完成為止。       設待排序列為:12,8,10,14,6,2,排序過程如下圖:              

kd樹(學習總結虛擬

kd樹是用來為求k臨近而建立的資料結構,查詢的平均複雜度是logN(和二叉樹很像) kd樹的建立 這裡在建立kd樹的時候,這裡的演算法是迴圈依次採取各個維度來構建二叉樹,也有做法是選取資料在該維度上方差最大的那一維,因為方差大代表資料較分散,會有

幾種基本排序算法總結

子序列 system aop 大於等於 != pri i++ index 元素移動 以下均采用從小到大排序: 1.選擇排序算法 個人覺得選擇排序算法是容易理解的排序算法,即從n個元素中選擇最小的一個元素與第一個元素交換,再將除第一個元素之外的n-1個元素找到最小的一

web h5常用代總結

版本 ios ble java return posit 密碼框 position ice 註意:本文原創,轉載請說明出處 1.使圖片和文字水平居中,給圖片css樣式:vertical-align: middle;vertical-align:middle的時候,是該元素的

常用狀態總結

客戶端請求 quest 頭信息 信息 指定日期 nbsp 狀態碼 post 人員 200:OK 請求成功。一般用於GET與POST請求 204:No Content 無內容。服務器成功處理,但未返回內容。在未更新網頁的情況下,可確保瀏覽器繼續顯示當前文檔 304:Not

常用的排序

log 冒泡 clear index push_back last public radi div 常用排序算法的代碼: 1 class Sort { 2 public: 3 // 冒泡排序 4 int* bubbleSort(int*

Java常用代總結

[] blog http ati target catch () log 字符串格式化 原創作品,可以轉載,但是請標註出處地址:http://www.cnblogs.com/V1haoge/p/7004474.html 1、日期與字符串之間的轉換 1 publ

ajax常用實例代總結參考

瀏覽器兼容 var edi else article ndt ons font 名稱 http的交互方法有四種:get、post、put(增加數據)、delete(刪除數據) put和delete實現用的是get和post get方式 頁面不能被修改,只是獲取查詢信息

面試常考各類排序算法總結.(c#)

style index 存在 算法面試 變量 一位 選擇排序 直接插入 color 一. 面試以及考試過程中必會出現一道排序算法面試題,為了加深對排序算法的理解,在此我對各種排序算法做個總結歸納。 1.冒泡排序算法(BubbleSort) 1 public Class

PHP_冒泡排序解析

temp 保存 變量 count pre 冒泡排序 代碼解析 var_dump logs <?php /** * 基本思想:將數組中的每一個下標元素遍歷出來 *依次將這些下標的值對後面一個下標的值對比 *如果大於後面一位下標的值,將兩者調換位置 */ $

經常使用排序算法總結

i+1 下標 del sta end else return trac false #include<iostream> using namespace std; //show array void show(int *ar, int len) {

單例模式的代總結

單例 col 方法 turn 關鍵字 工廠 運行 靜態 工廠方法 懶漢式單例類 /** * 懶漢式單例類 * 懶漢式是典型的時間換空間 * @author MJ * */ public class LazySingleton { private stat