排序的定義
對一串行物件根據某個關鍵字進行排序
術語說明
各種演算法的通俗理解!
貪心演算法:
從左到右,兩兩互換,每一次最後乙個數總是最大的
選擇排序:
從左到右,找到從當前位置開始最小的那個數,然後將當前位置的數與那個最小的數字置互換,直到最後
直接插入演算法:
從左到右,該數左邊的序列已經是有序的,如果該數比左邊第乙個數小,那麼從左邊第乙個數開始,若前乙個數還是比該數小,繼續往後挪乙個,否則就可以插入了
希爾排序:
希爾排序是基於插入排序的公升級版,通過分組的不斷擴大(這個過程由增量的不斷減小來實現),使得每一次調整過後當前陣列都比原來處於一種更有序的狀態,其調整的增量能夠保證最後一次進行插入排序時序列中大部分的元素處於有序狀態。
快速排序:
快速排序是將陣列一分為二,一般以第乙個元素作為分界點,從右到左找比分界點小的數,將其與分界點互換位置,從左到右找比分界點大的數,將其與分界點互換,然後將分界點放在分界的位置上,並分別對左邊和右邊的子陣列進行遞迴快排
歸併排序:
首先按照陣列長度將陣列一分為二,一直分,分到只有乙個數的時候,然後開始歸併這些數,按我的理解就是乙個打散再重建的過程,但是在重建的過程中會有排序的合併操作,歸併的時候定義乙個能夠容納兩左右陣列的大陣列用於返回值,考慮四種情況,第一,左邊沒有,返回右邊陣列;第二,右邊沒有,返回左邊陣列;第三,左邊的陣列值大於右邊的陣列值,將右邊的值放入大陣列,右邊索引加一;第四,右邊的陣列值大於左邊的陣列值,將左邊的值放入大陣列,左邊索引加一。遞迴返回大陣列。
演算法總結
氣泡排序的原理:
比較兩個相鄰的元素,將值大的元素交換至右端。
思路:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。重複第一趟步驟,直至全部排序完成。
設立標誌位優化
有乙個小小的優化:如果在某一趟的比較中沒有發生任何交換,那麼說明陣列中每乙個左邊的數都比右邊的數小,已經形成了事實上的有序,這時便不需要再進行下一趟的比較辣!!因此設定乙個標誌位,將其作為是否進行下一趟比較的判斷條件之一,在每一趟開始之前將其置為false,如果發生了交換就將其置為true,以便進行下一次的迴圈,否則沒發生交換標誌位一直為false,下一趟也就不用進行啦~
一定要注意迴圈條件的邊界啊喂!!!!!
**:
//冒泡演算法(設定了標誌位的改進版)
public
static
int[
] maopao (
int[
] array)
boolean flag =
true
;for
(int i=
0;i}return array;
}
選擇排序的原理:
第一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放在序列的起始位置,然後再從剩餘的未排序元素中尋找到最小(大)元素,然後放到已排序的序列的末尾。以此類推,直到全部待排序的資料元素的個數為零。
**
public
static
int[
]xuanze
(int
array)
if(array.length<2)
for(
int i=
0;i1;i++)}
swap
(array,i,temp);}
return array;
}
插入排序的原理:
插入排序是指在待排序的元素中,假設前面n-1(其中n>=2)個數已經是排好順序的,現將第n個數插到前面已經排好的序列中,然後找到合適自己的位置,使得插入第n個數的這個序列也是排好順序的。按照此法對所有元素進行插入,直到整個序列排為有序的過程,稱為插入排序。
**:
public
static
int[
]charu
(int
array)
if(array.length<2)
int now;
for(
int i=
0;i1;i++
) array[preindex+1]
= now;
}return array;
}
希爾排序的原理:
希爾演算法又名縮小增量排序,本質是插入排序,只不過是將待排序的序列按某種規則分成幾個子串行,分別對幾個子串行進行直接插入排序。這個規則就是增量,增量選取很重要,增量一般選序列長度一半,然後逐半遞減,直到最後乙個增量為1,為1相當於直接插入排序。
}歸併排序的原理:
歸併(merge)排序法是將兩個(或兩個以上)有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。
**:
public
static
void
guibing
(int
r,int low,
int high)
}public
static
void
merge
(int
r,int tempsize,
int low,
int m,
int high)
while
(i<=m)
while
(j<=high)
for(
int z=
0,x=low;x<=high;x++
,z++
)}
快速排序的原理:
設要排序的陣列是a[0]……a[n-1],首先任意選取乙個資料(通常選用陣列的第乙個數)作為關鍵資料(基準值),然後將所有比它小的數都放到它左邊,所有比它大的數都放到它右邊,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動。
快速排序中基準值的選取(三種方法):
elementtype median3
(elementtype a,
int left,
int right)
快排**:public
static
int[
] kuaipai (
int[
] array,
int begin,
int end)
int i = begin;
int j = end;
int base = array[begin]
;//選取基準值為第乙個數
while
(iif(i
while
(array[i]
<=base&&i
if(i
} array[i]
= base;
kuaipai
(array,begin,i-1)
;kuaipai
(array,i+
1,end)
;return array;
}
排序演算法介紹
排序也稱排序演算法 sort algorithm 排序是將一組資料,依指定的順序進行排列的過程。1 內部排序 指將需要處理的所有資料都載入到內部儲存器 記憶體 中進行排序。2 外部排序法 資料量過大,無法全部載入到記憶體中,需要借助外部儲存 檔案等 進行排序。1 穩定 如果 a 原本在 b 前面,而...
排序演算法介紹
排序也成排序演算法 sort algorithm 排序是將一組資料,依指定的順序進行排列的過程。排序的分類 1內部排序 需要處理的所有資料都載入到內部儲存器中進行排序 2外部排序 資料量過大,無法全部載入到記憶體中,需要借助外部儲存進行排序 常見的排序演算法 時間頻度 乙個演算法中的語句執行次數稱為...
詳細介紹匈牙利演算法步驟
這篇部落格介紹了匈牙利演算法的操作步驟,不討論原理。作用解決指派問題。所謂的指派問題就比如 甲乙丙三個人去做abc三件事情。每個人做每件事情所花的時間可能不一樣。每個人只能安排一件事情,問怎樣安排才能使三個人所工作的時間之和最小?擴充套件成 n 個人 n 件事也可以,但要求是 例項 甲乙丙中第i i...