常見排序演算法

2021-09-02 19:56:22 字數 2169 閱讀 2476

a. 冒泡

兩兩交換, 每一輪選出本輪最大的值交換到最後

第一輪arr.length-1次 第二輪 arr.length-2次 第三輪arr.length-3次 第i輪arr.length-i次

優化: 新增乙個布林值, 對本次迴圈是否排序進行監控,如果沒有,就停止迴圈

public

static

void

bubblesort

(int

arr)}if

(flag)

break;}

}

b. 選擇

遍歷陣列, 每一位數字i 和其之後的所有數字 j進行比較, 如果i>j, 交換值

每一次外迴圈找出本次迴圈最小的值

public

static

void

selectsort

(int

arr)}}

}

c. 插入

第乙個元素預設排好序, 從下一位元素i開始, 依次向前一位j比較, 如果ij , 再講i放到此時j元素後

public

static

void

insertsort

(int

arr)

arr[j+1]

=next;

}}

d. 希爾

實現原理: 1. 基本有序 : 小的關鍵字基本在前面, 大的關鍵字基本在後面, 不大不小的基本在中間

2. 將相距某個"增量"的記錄組成乙個子串行, 保證基本有序而不是區域性有序

將元素進行分組, 一般 分組大小 grep=length/2 /2 … 直到grep等於1

組內進行插入排序

public

static

void

shellsort

(int

array)

array[preindex + gap]

= temp;

} gap /=2;

}}

e. 堆排序

將元素按照最大堆的結構進行排列, 之後再將堆首和右孩子進行交換, 得到本輪最大元素, 依次進行

最大堆: 將資料按照二叉樹的方式進行排列,其中每個節點的根節點的值大於其左子樹和右子樹,與左、右孩子的大小無關,稱為最大堆。

f. 計數

掃瞄陣列, 獲取源陣列中最大值max和最小值min, 開闢乙個新陣列, 陣列大小為max-min+1

將源陣列的元素作為下標, 出現次數作為值, 存入新陣列中, 遍歷新陣列, 取出下標, 得到有序元素

g. 快排

選取基數元素i, 小於i的元素往前放, 大於i的元素往後放

public

static

void

quicksort

(int

arr,

int _left,

int _right)

//將比基準元素小的座標覆蓋到第一位

arr[left]

=arr[right]

;//從左往右掃瞄,獲取第乙個比基準元素大的元素下標

while

(left<=temp)

arr[right]

=arr[left]

; arr[left]

=temp;

quicksort

(arr,_left,left-1)

;quicksort

(arr,right+

1,_right);}

}}

h. 基數排序

將元素按照最大元素的位數進行補齊, 依次比較個位 十位 百位 進行排序

i. 桶排序

將元素分桶, 先掃瞄一遍序列求出最大值 maxv 和最小值 minv ,設桶的個數為 k ,則把區間 [minv, maxv] 均勻劃分成 k 個區間,每個區間就是乙個桶。將序列中的元素分配到各自的桶。

常見排序演算法

一.選擇排序 1.概念 每次從無序的子陣列裡面選擇最小的數,放在有序區的後面 既與無序區的首元素交換 不穩定排序 時間複雜度o n 2 輔助儲存o 1 2.實現 int selection sort int a,int len len為陣列元素個數 二.氣泡排序 1.概念 重複訪問數列n 1次,每次...

常見排序演算法

1 插入排序 直接插入排序,是一種最簡單的排序方法,它的基本操作是將乙個記錄插入到已排好序的有序表中,從而得到乙個新的 記錄數增1的有序表。初始 38 65 27 76 13 i 1 13 選13為監視哨並假設為乙個有序序列 i 2 13 38 待插入元素38 13 i 3 13 38 65 待插入...

常見排序演算法

排序演算法作為常用的基本演算法,今天就來總結一下各種經典排序演算法,這裡只貼出 對演算法的文字描述可以在課本或其它部落格上找到很多詳盡的敘述,這裡直接上 而不是常見演算法書上的偽 希望對正在努力學資料結構與演算法的朋友們有幫助 1 氣泡排序 void bubblesort t a,int n if ...