面試常用算法整理


知識點:基本算法 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM