Java學習路程之陣列與排序(氣泡排序、選擇排序、折半查詢)
阿新 • • 發佈:2019-02-08
一.陣列
1.一維陣列:儲存一組相同資料型別的元素.
2.陣列的三種宣告方式
array為陣列的命名
資料型別表示的是陣列中元素的資料型別
int[] array = new int[陣列長度];
int[] array = new int[] {1,2,3};
int[] array = {1,23};
獲取陣列的長度:array.length
3.堆區和棧區
棧:由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等.
棧區特點:
1.所有的函式執行的時候都會進入棧區當中,函式執行完畢之後,會自動出棧銷燬.
2.遵循先進後出的原則
堆:一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由OS回收 。
堆區特點:
1.堆記憶體會分配記憶體地址
2.堆記憶體會分配初值,基本資料型別的初值為哦0,引用資料型別的初值為null.
3.垃圾回收機制(一塊記憶體沒人使用,就會成為垃圾,在某一時候系統會自動回收)
public class Day04 {
public static void main(String[] args) {
//注意:陣列的長度一旦確定就不能改變
//關鍵詞new表示會在堆記憶體中開闢一塊空間如圖:
//陣列會在堆記憶體當中開闢一塊連續的記憶體空間
//宣告陣列可以儲存五個int元素
int[] array = new int[5];
//如何給陣列賦值中的元素
//使用下標對陣列元素進行賦值和取值,下標從0開始
//陣列名[下標] = 值;
array[3 ] = 10;
System.out.println(array[3]);
//ArrayIndexOutOfBoundsException下標越界異常
array[5] = 15;
System.out.println(array[5]);
array = null;//把array儲存的地址指向空
//NullPointerException(空指標異常,訪問了不屬於你的記憶體區域)
array[3] = 3;
System.out.println(array[3]);
![陣列在棧和堆的執行機制](https://img-blog.csdn.net/20180823192519810?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2w3MTA4MjA3NDI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
}
}
練習1:
檢視陣列中的每一個元素(遍歷陣列)
int[] array1 = {1, 2, 3, 4, 5};
public class Day04 {
public static void main(String[] args) {
for (int i = 0; i < array1.length; i++) {
System.out.println(array1[i]);
}
}
}
練習2:
需求: 隨機10個數 隨機的區間為[15,150]
1.把這個10個數放入陣列中
2.列印最大值/最小值
public class Day04 {
public static void main(String[] args) {
int[] array2 = new int[10];
int max = 0;//宣告最大值
int min = array2[0];//宣告最小值可以宣告陣列中的某一元素
for (int i = 0; i < 10; i++) {
//隨機一個[15,150]之間的數
int num = (int)(Math.random() * (150 - 15 + 1) + 15);
array2[i] = num;
//判斷求最大值
if (array2[i] > max) {
max = array2[i];
}
//判斷求最小值
if (array2[i] < min) {
min = array2[i];
}
}
System.out.println("最大數:"+ max);
System.out.println("最小數:" + min);
//Arrays是陣列工具類,可以列印陣列.
System.out.println(Arrays .toString(array2));
}
}
練習3:
根據下標查詢對應的元素
需求: 封裝一個函式 傳入數字1 返回 一 數字2 返回 二 ….. 數字5 返回 五
public class Day04 {
public static void main(String[] args) {
System.out.println(findKeyIndex(1));
}
public static char findKeyIndex(int n){
//宣告char型別的陣列
char[] array = {'一', '二', '三', '四', '五'};
return array[n - 1];
}
}
練習4:
需求:分裝一個函式:
定義一個數組 陣列值 分別 3,6,11,22
在陣列中 查詢 11的位置
public class Day04 {
public static void main(String[] args) {
int[] array = {3, 6, 11, 22};
int num = findIndex(array,11);
}
public static int findIndex(int[] array,int n){
//宣告一個變數儲存下標
int index = -1;
for (int i = 0; i < array.length; i++) {
//查詢 相同的元素
if (array[i] == n) {
index = i;
}
}
return index;
}
}
練習5:
陣列元素的反轉
基本資料型別引數傳遞時是值的傳遞,引用資料型別比如陣列引數傳遞時是地址的傳遞
public class Day04 {
public static void main(String[] args) {
int[] array = {1, 2, 3, 6, 8};
reverse(array);
//注意:交換兩個元素的值分裝的函式不能呼叫之後,在列印它們的值
System.out.println(Arrays .toString(array));
}
private static void reverse(int[] array) {
int temp;
for (int i = 0; i < (int)(array.length/2); i++) {
temp = array[i];
array[i] = array[array.length - 1 - i];
array[array.length - 1 - i] = temp;
}
}
}
二,氣泡排序
核心:依次交換陣列中相鄰元素的值
每比一個迴圈確定了比較元素中最大的數
外層迴圈控制比較的次數,內層迴圈控制一輪比較多少次
外層迴圈減一表示迴圈比較的次數
內層迴圈減一表示防止角標越界
內層迴圈減i表示每次外層迴圈後內層迴圈次數少一次
public class Day04 {
public static void main(String[] args) {
int[] array = {3, 2, 5, 1, 2, 9};
int temp;
for(int i = 0; i < array.length - 1; i++){
for(int j = 0; j < array.length - 1 - i; j++){
if(array[j] > array[j + 1]){
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
System.out.println(Arrays.toString(array));
}
}
//輸出:
{
[1, 2, 2, 3, 5, 9]
}
三.選擇排序
核心:選擇一個數與其他的數進行比較交換,一般選第一個數
public class Day04 {
public static void main(String[] args) {
//外迴圈減一是五個數比四趟
//內迴圈1+i表示每一趟確定有一個數不再比較
int[] array = {3, 2, 5, 1, 2, 9};
int temp;
for(i = 0; i < array.lengh - 1; i++){
for(j = 1 + i; j < array.length; j++){
if(array[i] > array[j]){
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
System.out.println(Arrays.toStrring(array));
}
}
四.折半查詢
折半查詢:在陣列中根據元素查詢對應的角標
前提:必須在有序的陣列中查詢
public class Day04 {
public static void main(String[] args) {
int[] array = {1, 10, 20, 30, 40, 50, 55, 60, 78, 90};
int max = array.length - 1;//最大角標
int min = 0;最小角標
int mid = (max + min)/2;折半角標
int num = 55;
//有明確的迴圈結束條件用while迴圈
while(array[mid] != num){
if(array[mid] > num){
max = mid - 1;
}
if(array[mid] < num){
min = mid + 1;
}
//判斷陣列中有沒有這個值
mid = (max + min)/2;
if(min > max){
mid = -1;
break;
}
}
System.out.println(mid);
}
}