介紹一下四種Java的經(jīng)典算法,這四種算法是非常基礎(chǔ)的算法,學(xué)算法對(duì)我們深入理解程序有很大幫助。
- 選擇排序
- 冒泡排序
- 插入排序
- 二分查找
選擇排序
初始時(shí)第一個(gè)元素依次和后面的元素比較,在序列中找到最小元素并記錄其下標(biāo),第一輪比較完畢后把最小元素交換到序列的起始位置作為已排序序列,然后再?gòu)氖O碌奈磁判蛟刂姓业阶钚≡兀诺揭雅判蛐蛄心┪玻钡剿性嘏帕型戤叀?/p>
選擇排序.gif
示例代碼:
public void selectSort(int[] array) {
for (int i = 0; i < array.length - 1; i++) {//第i個(gè)元素
int num = array[i];
int index = i;
for (int j = i + 1; j < array.length; j++) {//第i+1個(gè)元素
if (array[j] < num) {//比較
num = array[j];
index = j; //選出最小的值記錄下標(biāo)
}
}
array[index]=array[i];//交換位置
array[i]=num;
}
}
冒泡排序
重復(fù)的訪問(wèn)要排序的元素,依次比較相鄰的兩個(gè)元素,如果需要交換就交換他們的位置,直到?jīng)]有元素再需要交換,每一輪交換之后都會(huì)有一個(gè)最值冒泡出來(lái),所以此方法形象的稱為冒泡排序。
冒泡排序.gif
示例代碼:
public void bubbleSort(int[] array){
int temp;
for(int i = 0; i < array.length - 1; i++){//外層循環(huán)控制輪數(shù)
for(int j = 0; j < array.length - 1 - i; j++){//內(nèi)層循環(huán)控制次數(shù)
if(array[j] > array[j + 1]){ //比較相鄰元素,如果需要就兩兩交換
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
直接插入排序
從第二個(gè)元素開(kāi)始,把待排序的元素和此元素之前的元素從后向前依次比較,將大于此元素的逐個(gè)后移一位,找到合適位置并插入進(jìn)去,直到所有的元素插入完畢為止,得到一個(gè)新的有序序列。
直接插入排序.gif
示例代碼:
public void insertSort(int[] array){
int insertNum; //要插入的數(shù)
for(int i = 1; i < array.length; i++){ //從數(shù)組第2個(gè)元素開(kāi)始遍歷
insertNum = array[i];
int j = i - 1; //已經(jīng)排序好的序列元素個(gè)數(shù)
while(j >= 0 && array[j] > insertNum){ //序列從后到前循環(huán),將大于insertNum的數(shù)向后移動(dòng)一格
array[j + 1] = array[j]; //array[j]的值后移
j--; //j前移
}
array[j + 1] = insertNum; //將需要插入的數(shù)放在要插入的位置。
}
}
二分查找
二分查找又稱折半查找,查找一個(gè)有序數(shù)組中的元素。首先,假設(shè)數(shù)組元素是按升序排列,將數(shù)組中間位置記錄的關(guān)鍵字與查找關(guān)鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將數(shù)組分成前、后兩個(gè)子表,如果中間位置記錄的關(guān)鍵字大于查找關(guān)鍵字,則進(jìn)一步查找前一子表,否則進(jìn)一步查找后一子表。重復(fù)以上過(guò)程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時(shí)查找不成功。
折半查找.jpg
示例代碼:
int binarySearches(int[] array, int key) {
int startIndex = 0; //開(kāi)始查找的下標(biāo)位置0
int endIndex = array.length - 1; //結(jié)束查找的下標(biāo)位置為數(shù)組的最后一個(gè)元素
while (startIndex <= endIndex) {
int midIndex = (startIndex + endIndex) / 2;
if (array[midIndex] < key){
startIndex = midIndex + 1;
}else if (array[midIndex] > key){
endIndex = midIndex - 1;
}else{
return midIndex; // 找到了,返回元素下標(biāo)
}
}
return -(startIndex + 1); // 沒(méi)有找到,返回開(kāi)始下標(biāo)加1的負(fù)值
}