黑馬程式員--java基礎學習筆記5

來源:互聯網
上載者:User

標籤:黑馬程式員   java基礎編程   編碼   java   

黑馬程式員--java基礎學習筆記6    一、筆記內容概述:        數組-第二種定義格式、數組-常見操作-遍曆-最值-選擇排序-冒泡排序-排序位置置換代碼提取、數組-排序的效能問題、數組-常見功能-尋找-折半尋找、進位轉換-查表法-整合。    二、常用內容介紹:        1.數組初始化的三種方式:            int[] arr = new int[3];            int[] arr = new int[]{1,2,3};            int[] arr = {1,2,3};         2.查表法:            如果資料中出現了對應關係,而且對應關係的一方是有序的數字編號,並作為角標使用,這時就必須想到數組的使用(後面也可以使用map集合),這時就可以將這些資料存放區到數組中,根據運算的結果作為角標直接去查數組中對應的元素即可,這種方法稱為:查表法。        3.右移動作>>運算速度快,下面兩個等價。            mid = (max+min)/2;    mid = (max+min)>>1;    三、經典樣本及講解:        1.選擇排序演算法:
package com.date5;/** *選擇排序思路: (可以根據確定最大值來排序,也可以根據確定最小值來進行排序,這裡採用最小值) * 1.首先拿數組第一個元素依次與除其自身外的其它每個元素順序比較, *   如果第一個元素大於剩下的某個元素,就互換內容。 * 2.經過一輪比較之後,此時,第一個元素就是數組中最小的元素。然後 *   再拿第二個元素與除第一個元素和其自身外的其它進行比較,如果第 *   二個元素大於剩下的某個元素,就互換內容。此時,第二個元素就是數 *   組中倒數第二小的元素。 * 3.依次類推,直到最後一個元素。 *  * 4.下面的Mysort方法之所以不用返回int數組的原因為:arr引用變數是 *   對傳入Mysort方法中作為參數的數組的引用,Mysort方法執行完畢之後, *   我們依然可以通過arr引用變數操作傳入的數組。所以,沒有必要再通過傳回值擷取。 */public class Demo3 {private static int count = 0;public static void main(String[] args){int[] arr = {89,34,-270,17,3,100};System.out.print("排序前數組: ");printArray(arr);Mysort(arr);System.out.print("排序後數組: ");printArray(arr);System.out.println("交換總次數為:"+count);}//對數組進行排序public static void Mysort(int[] arr){for(int i=0;i<arr.length-1;i++){for(int j=i+1;j<arr.length;j++){if(arr[i]>arr[j]){ change(arr,i,j);count++;}}}}//交換函數private static void change(int[] arr,int i,int j){//使用^異或運算子arr[i] = arr[i] ^ arr[j];arr[j] = arr[i] ^ arr[j];arr[i] = arr[i] ^ arr[j];/*int temp = arr[i];arr[i] = arr[j];arr[j] = temp;*/}//列印數組private static void printArray(int[] arr) {for(int i=0;i<arr.length;i++){if(i==arr.length-1){ System.out.println(","+arr[i]+"]");break;}if(i==0) System.out.print("["+arr[i]);elseSystem.out.print(","+arr[i]);}}}
        2.選擇排序演算法最佳化:
package com.date5;/** *效率分析:  *     選擇排序演算法最佳化,因為選擇排序一輪比較的結果就是擷取最小值 *     ,所以我們沒必要在這輪比較中,調用多次交換方法,只需要用一個變數 *     記錄這一輪比較下來的最小值num和它的角標index,最後在比較,如果這個最小值 *     就是其本身,那麼連一次調用交換方法的必要都沒有了,這樣以減少交換次數的方式 *     ,理論上提高了效率,我定義一個變數count來記錄兩個傳統方式和這種方式的效率情況。 */public class Demo4 {//定義一個全域變數來記錄交換的次數private static int count = 0;public static void main(String[] args) {//1.初始化數組int[] arr = {89,34,-270,17,3,100};System.out.print("排序前:");arr_print(arr);//2.調用排序方法my_sort(arr);System.out.print("排序後:");//3.列印結果arr_print(arr);System.out.println("交換總次數為:"+count);}private static void my_sort(int[] arr) {for(int i=0;i<arr.length-1;i++){//記錄下當前進行比較的自身值和角標int num = arr[i];int index = i;for(int j=i+1;j<arr.length;j++){//將最小值和其角標記錄下來if(num>arr[j]){num = arr[j];index = j;}}//如果最小值就是其本身,就不執行交換操作,否則執行if(i!=index){change(arr,i,index);count++;}}}//交換函數private static void change(int[] arr, int i, int index) {int temp = arr[i];arr[i] = arr[index];arr[index] = temp;}//列印函數private static void arr_print(int[] arr) {System.out.print("[");for(int i=0;i<arr.length;i++){if(i!=arr.length-1){System.out.print(arr[i]+",");}else{System.out.println(arr[i]+"]");}}}}
        3.折半尋找演算法(又稱為二分尋找法)
package com.date5;/** *二分尋找演算法:(建立在有序數組基礎上的快速尋找元素的方法)  * 1.設定三個變數記錄角標:min、max、mid,min初始化值為0,max為數組最大角標,mid為 * (max+min)/2。 * 2.查看mid角標的元素是否與待尋找的值相等,如果相等,則直接返回角標值,程式終止執行。 * 3.如果待尋找的值小於角標為mid的元素值,那麼說明待尋找的元素的位置可能在min和mid角標 *   之間,重新設定max = mid-1,mid = (max+min)/2,重複第1、2步的操作 * 4.如果待尋找的值大於角標為mid對應角標的元素值,那麼說明待尋找的元素的位置可能在mid與max *   之間。設min = mid +1,mid = (max+min)/2,重複第1、2步的操作。 * 5.如果數組中不存在待尋找的元素,那麼按照如上流程,最終min角標值會大於max角標值,此時返回 *   -1。 */public class Demo6 {public static void main(String[] args){int[] arr = {1,2,3,4,5,6,7,8,9};int index = MybinarySearch(arr,10);System.out.println("對應的角標是:"+index);}public static int MybinarySearch(int[] arr,int x){int max = arr.length-1;int min = 0;int mid = (max+min)/2;//定義一個傳回值int temp = 0;//只要它跟尋找的值不一樣就執行這個迴圈while(arr[mid]!=x){//如果所尋找的那個數比中間值大if(arr[mid]<x){min = mid + 1;}//如果所尋找的那個數比中間值小if(arr[mid]>x){max = mid - 1;}mid = (max+min)/2;//如果這個有序數組中沒有該元素,就返回-1if(min>max){return -1;}}return mid;}}
        4.擷取一個十進位的2、8、16進位的表現形式
package com.date5;/** *擷取一個十進位的2、8、16進位的表現形式 *注意: *    如果資料出現了對應關係,而且對應關係的一方是有序的數字編號,並作為 *    角標使用,這時候必須要想到數組的應用。 *思路: *   1.首先判斷如果傳入的十進位數為0,那麼它的2、8、16進位都是0,直接返回 *     0,不需要再執行餘下的程式。 *   2.如下面的所示,以將十進位數轉換成十六進位數為例: *     將60與15進行與操作,其值就是60的十六進位的最低位。 *     再將60無符號右移4位,再與15進行與操作,其值就是60的十六進位的倒數第二位。 *   3.由上面的例子可以總結出,將一個十進位數轉換為十六進位的步驟就是: *     將十進位數與15相與,將結果儲存到一個數組的最低位。 *     然後將十進位數右移4位,再與15進行與操作,其值就是該數對應的十六進位的倒數 *     第二位。 *     再右移4為,與15相與,直到相與結果為0為止。 *   4.進而可以推理得到,10進位轉換為2和8進位的規律與轉換為16進位很相似,只是位移 *     量和相與的數字不同而已。 *     10進位轉換為2進位的位移量為1,相與數字為1. *     10進位轉換為8進位的位移量為3,相與數字為7. */public class Demo7 {public static void main(String[] args){toHex(60);toBin(-6);}public static void toBin(int num) {//十進位轉換成二進位相與數字為1,位移量為1trans(num,1,1);}public static void toHex(int num) {trans(num,15,4);}//通用轉換方法public static void trans(int num, int base, int offset) {if(num == 0){System.out.println("0");return;}char[] chs = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//建立一個數組來存放轉換後的結果char[] arr = new char[32];//記錄當前pos所移到的角標int pos = arr.length;    while(num!=0){    int temp = num & base;    //從最高位開始存    arr[--pos] = chs[temp];    //無符號右移    num = num >>> offset;    }    System.out.println("pos="+pos);    for(int x = pos;x<arr.length;x++){    System.out.print(arr[x]);    }    System.out.println();}}





著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

黑馬程式員--java基礎學習筆記5

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.