常用的選擇排序演算法

2021-09-25 22:44:09 字數 2917 閱讀 4769

一、排序

1.選擇排序(比較次數n2/2,交換次數n,原理是每次都找到最小的元素與第乙個元素交換位置)

int sort(int a)

} //交換

b = a[i];

a[i] = a[min];

a[min] = b;

} return a;

}2.插入排序(原理就像整理橋牌,將每一張牌插入已經有序的牌中,後面的牌右移。當索引到達最右邊時,排序結束。排序時間與輸入有關。平均需要n2/4次比較和交換,最差需要n2/2次比較

和交換,最好情況下需要n-1次比較和0次交換)

int sort(int a) //左邊陣列用盡

else if(j>hi) //右邊陣列用盡

else if(aux[j]v) if(j==lo) break;

if(i>=j)

//交換兩個陣列元素

exch(a,i,j);

} //將切分元素放入正確的切分位置

exch(a,lo,j);

//返回切分點

return j;

}6.堆排序(優先佇列)

//堆上浮

void swim(int k)

}//堆下沉

void sink(int k)

else return x.val;

}//插入

//這個函式的特點是輸入的節點和返回的節點都是同乙個

node put(node x,key key,value val)

int a = key.compareto(x.key);

if(a<0)

else if(a>0)

else x.val=val;

//不管是更新的value值還是更新的左右鏈結,都是更新x

return x;

}//查詢最大

同查詢最小

//查詢最小

node min(node root)

return min(x.left);

}//查詢大於等於key的最小鍵

同下,只需將左變為右同時將小於變為大於。

//查詢小於等於key的最大鍵(給定的鍵小於二叉樹根節點,那必然在左子樹中;若大於根節點,則可能在右子樹中或者就是根節點)

//x代表根節點

node floor(node x,key)

int a = key.compareto(x.key);

if(a==0)//等於直接返回

if(a<0)

//下面是a>0

node t = floor(x.right,key);

if(t!=null)

//返回根節點

else

}node deletemin(node x)//刪除最小的返回次小的

//有左子樹則繼續往下遞迴

x.left = deletemin(x.left);

return x;

}刪除節點的4個步驟:

1.把將要刪除的節點x物件的鏈結儲存為t(也就是另外儲存乙份)

2.將指向要刪除節點x的父鏈結指向它的後繼節點min(t.right)

3.將新的節點x的右鏈結指向deletemin(t.right),因為這些節點都大於新的節點x

4.將新的節點x的左鏈結指向t.left

//刪除節點(二叉樹中最難)

//x指的是根節點,方法返回值是代替原來根節點的節點

node delete(node x,key key)

int a = key.compareto(x.key);

//刪左邊

if(a<0) x.left = delete(x.left);

//刪右邊

if(a>0) x.right = delete(x.right);

//找到要刪除的節點,將引用儲存到t方便重建代替刪除節點的新節點的左右子樹

node t = x;

//用右子樹的最小節點代替

x=min(t.right);

//構建新節點的右子樹

x.right=deletemin(t.right);

//構建新節點的左子樹

x.left=t.left;

//返回替代已刪除節點的新的根節點

return x;

}2.平衡查詢樹及其相關方法

2.1紅黑二叉查詢樹(原理是2-3樹)

2-3樹插入演算法的根本是變換都是區域性的,變更的鏈結數量不會超過乙個很小的常數。這些區域性變換不影響樹的全域性有序性和平衡性。任意空鏈結到根節點的距離都是相等的。

標準二叉樹從上向下生長,有最壞情況下的效能問題;2-3樹從下向上生長,沒有效能問題。

紅黑樹既是二叉查詢樹又是2-3樹,結合了二叉樹簡單的查詢演算法和2-3樹高效的平衡插入演算法。

//左旋轉(將紅鏈結從右鏈結調整到左鏈結)

node rotateleft(node x)

//判斷連線某節點的鏈結是否為紅色

boolean isred(node x)

//轉換鏈結顏色(最後一步)

void flipcolor(node x)

//紅黑樹的插入演算法

public void put(key key,value value)

private node put(node h,key key, value value)

向一棵雙鍵樹(3-節點)中插入新鍵有三種子情況:

1.新鍵大於原樹中的兩個鍵,被連線到3-節點的右鏈結,只需要改變顏色即可。

2.新鍵是最小的,將上層的紅鏈結右旋轉,再改變顏色。

3.新鍵介於兩者之間,將下層的紅鏈結左旋轉,再將上層的紅鏈結右旋轉,再改變顏色。

一棵大小為n的紅黑樹的最大高度不會超過2logn(最壞情況是樹的最左邊的路徑節點全都是3-節點),根節點到任意節點的平均路徑長度為1logn

3.雜湊表

常用排序演算法 選擇排序

選擇法排序 找出最小值,依次第乙個位置互換。例如陣列 33,6,5,59,12 第一次遍歷 找出最小值 12與陣列第乙個值33互換 第二次遍歷 找出除陣列第乙個值以外的剩下的最小值 5,與陣列第二個位置的值6互換 外部迴圈設定遍歷次數,陣列5個元素最多需要4次遍歷,因為每次決定陣列的乙個位置,最後乙...

常用排序演算法 選擇排序

選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小 大 元素,然後放到已排序序列的末尾。以此類推,直到全部待排序的資料元素排完。選擇排序是不穩定的排序方...

常用演算法之排序演算法 選擇排序

目錄 直接選擇排序 堆排序 思想 每趟從待排序的記錄序列中選擇關鍵字最小的記錄放置到已排序表的最前位置,直到全部排完。關鍵問題 在剩餘的待排序記錄序列中找到最小關鍵碼記錄。簡單的選擇排序 1 基本思想 在要排序的一組數中,選出最小的乙個數與第乙個位置的數交換 然後在剩下的數當中再找最小的與第二個位置...