知識點:基本算法 algorithms
1.線性查找
2.二分查找
描述:在數組中查找指定數值
首先要求該組元素必須是有序的,假設默認是從小到大排列,使用該組元素的中間元素與目標元素進行比較,如果相等則查找成功,如果中間元素比目標元素小,則去中間元素的右側查找(遞歸),如果中間元素比目標元素大,則去中間元素的左側查找(遞歸),直到找到目標元素 或者比較完畢,表示查找失敗。
int a={3,6,7,9,16,28,32}
偽代碼:
// 注意: 使用二分查找算法的前提是數組元素必須有序
public static void main(String[] args) {
int a={3,6,7,9,16,28,32}
int n=a.length;
SearchBinary(a,16,0,n);
}
public static int SearchBinary(int a[ ],int value,int left,int right){
if(left<=right){
int mid=(left+right)/2;
tempValue=a[mid];
// 和中間元素比較,如果相等,查找成功
if(tempValue==value){
return mid;
}
// 如果小於中間元素,去左邊找
else if(tempValue>value){
return SearchBinary(a,value,left,mid-1);
}
// 如果大於中間元素,去右邊找
else if(tempValue<value){
return SearchBinary(a,value,mid+1,right);
}
}
//比較完畢
return -1;
}
3.冒泡排序
int [] a = {10,4,7,3,9}; n=a.length;
<!--
數據舉例demo
第一趟:: 4 7 3 9 10 交換 4次(5-1)
第二趟 :4 3 7 9 10 交換 3 次(5-2)
。。。
第i趟: 交換 n-i 次 (n-i)
-->
偽代碼:
//n-1趟
for(int i=1;i<=n-1;i++){
//n-i次(i趟對應的次數)
for(int j=0;j<n-i;j++){
if(a[j]>a[j+1]){
//兩瓶水交換,借助第三個瓶子為媒介
int tempcontainer=a[j];
a[j]=a[j+1];
a[j+1]=tempcontainer;
}
}
}
4.插入排序 (把n個待排序的元素看成一個有序表和一個無序表,開始時有序表中只有一個元素,無序表中有n-1個元素;排序過程即每次從無序表中取出第一個元素,將它插入到有序表中,使之成為新的有序表,重復n-1次完成整個排序過程。)
int [] a={3,1,5,23,2,4};n=a.length;
<!--
數據舉例demo
第一趟: 1,3,5,23,2,4
第二趟: 1,3,5,23,2,4
。。。
第 i 趟 :
-->
偽代碼:(詳細思路代碼,可參考https://www.cnblogs.com/snowcan/p/6244128.html)
//n-1趟循環
for (int i=1;i<n;i++){
//tempcontainer存放本輪插入有序列表中的數
int tempcontainer=a[i];
//判斷tempcontainer要插入的位置
for(int j=i-1;j>=0&&a[j]>tempcontainer;j--){
//將第j上的元素,朝后移動
a[j+1]=a[j];
}
//將tempcontainer,插入到空出來的位置上
a[j+1]=tempcontainer; //到這里,之前for循環,j位置的元素已經移到j+1的位置上了,j--位置的元素如果不滿足條件,跳出循環,此時要想在j的空位置上賦值,
//必須a[j+1],因為在跳出循環之前j--了
}
5.簡單選擇排序(基本思想:給定數組 int[] arr={里面n個數據};第1趟排序,在待排序數據arr[0]~arr[n-1]中選出最小的數據,將它與arrr[0]交換;第2趟,在待排序數據arr[1]~arr[n-1]中選出最小的數據,將它與r[1]交換;以此類推,第i趟在待排序數據arr[i-1]~arr[n-1中選出最小的數據,將它與r[i-1]交換,直到全部排序完成。)
int [] a={3,1,5,23,2,4};n=a.length;
<!--
數據舉例demo
第一趟: 1,3,5,23,2,4
第二趟: 1,2,5,23,3,4
。。。
第 i 趟 :
-->
偽代碼:(詳細思路代碼,可參考https://www.cnblogs.com/shen-hua/p/5424059.html)
//n-1趟循環
for(int i=0;i<n-1;i++){
int min=i; //第i趟最小值,下標用min來記錄
for(int j=min+1;j<n;j++){ //選擇最小記錄
if(a[j]<a[min]){
min=j;//記下當前找到的最小值所在的位置
}
}
//內層循環結束后,已經找到了本輪循環的最小數,再進行交換
if(i !=min){//如果i下標的位置,不是最小值的話(min=i的情況),則交換a[i]和a[min]
int temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
6.n層漢諾塔問題
(知識點參考知乎:https://www.zhihu.com/question/24385418)
(偽代碼參考https://www.cnblogs.com/gw811/archive/2012/10/10/2719181.html)
描述:
圖片動畫演示:
三維動畫演示可查看:https://hightopo.com/demo/hanoi_20151106/index.html
偽代碼:
public class Hanoi {
public static void move(int n,String from,String temp,String to){
if(n>0){
move(n-1,from,to,temp);
System.out.println("盤"+n+"由"+from+"移到"+to);
move(n-1,temp,from,to);
}
}
public static void main(String[] args) {
move(3,"A","B","C");
}
}
輸出結果:

以上是偽代碼,詳細代碼參考
博客:https://www.cnblogs.com/Ray1024/p/10337144.html
補充:關於其他經典排序算法(希爾排序、快速排序、歸並排序、堆排序、基數排序等) 可以參考 https://www.cnblogs.com/fivestudy/p/10212306.html