天天看點

Lesson_for_java_day07--java中數組的定義及常見排序方法--冒泡法、簡單選擇法、直接插入法和調用方法排序

一、數組的定義

在java中數組被看成是一個對象.在定義數組時,有兩種定義方法:int[] a 和int a[];
	第二種是C/C++對數組定義方式,對于JAVA建議采用第一種定義方式。
	總的原則:任何對象在被調用之前必須先被初始化!

1、一維數組的定義
	定義包含三個元素的一維數組
	方法1:先new對象,然後再初始化每個元素。int[] a = new int[3]; 
		用new int[3]這種方式建立對象,對象已經被初始化并賦初值為0。
	方法2:直接賦初值來建立對象。int[] b = {1,2,3};	
	方法3:new完對象直接初始化。int[] c = new int[]{1,2,3};
		如果指定了數組初始化操作,則不能定義維表達式。

	注意:如果用new定義數組時,必須指定其次元,這樣定義是錯誤的: int[] d = new int[];
		如果無法确定其元素個數,可以這樣定義:int[] e = {};

2、二維數組的定義。基本與一維數組類似
	定義一個3行5列的二維數組

	方法1:先new對象,然後再初始化每個元素。int[][] a = new int[3][5]; 

	方法:直接賦初值來建立對象。int[][] b = {{1,1,1,1,1}, {2,2,2,2,2}, {3,3,3,3,3} };
	方法3,new完對象直接初始化。int[][] a = new int[][] {{1,1,1,1,1}, {2,2,2,2,2}, {3,3,3,3,3} };

	注意:定義二維數組必須指定其行數,列數可以指定,可以不指定。
		這樣定義是正确的:int[][] d = new int[3][];
		這樣定義是錯誤的:int[][] d = new int[][4]; int[][] d = new int[][];

	也可以定義不規則數組:
		arr = new int[2][];
		arr[0] = new int[3];
		arr[1] = new int[5];

3、數組的長度
	length是數組的一個屬性(不是方法!),對于一維數組int[] b = {1,2,3}; b.length的值是3,

4、數組的初始值
           
Lesson_for_java_day07--java中數組的定義及常見排序方法--冒泡法、簡單選擇法、直接插入法和調用方法排序

二、數組的排序方法

java中常見的四種數組排序方法:

1、調用方法排序法:
直接調用Array.sort(int[] arr),對數組進行排序

2、冒泡法:
基本思想:依次比較相鄰的兩個數,将小數放在前面,大數放在後面(或者大在前,小在後)
優點:穩定
缺點:比較的數多,速度慢,每次隻能移動相鄰兩個資料,時間長,效率低
示意圖:
           
Lesson_for_java_day07--java中數組的定義及常見排序方法--冒泡法、簡單選擇法、直接插入法和調用方法排序
3、簡單選擇排序法:
基本思想:每一趟從待排序的資料元素中選出最小(或最大)的一個元素,
順序放在已排好序的數列的最後(最前),直到全部待排序的資料元素排完。
優點:移動資料的次數已知(n-1次)。
缺點:不是穩定的排序方法,比較次數多。
示意圖:
           
Lesson_for_java_day07--java中數組的定義及常見排序方法--冒泡法、簡單選擇法、直接插入法和調用方法排序
4、直接插入排序法:
基本思想:将一個資料插入到已經排好序的有序資料中,進而得到一個新的、個數加一的有序資料 
優點:是穩定的排序方法,速度較快。
缺點:比較次數不一定,比較次數越少,插入點後的資料移動越多,特别是當資料總量龐大的時候,
可連結清單可以解決這個問題。此算法适用于少量資料的排序。
示意圖:
           
Lesson_for_java_day07--java中數組的定義及常見排序方法--冒泡法、簡單選擇法、直接插入法和調用方法排序

代碼:

/*
java數組中最常見的幾種排序方式:
1、調用方法排序法:
	直接調用Array.sort(int[] arr),對數組進行排序
	
2、冒泡法:
	基本思想:依次比較相鄰的兩個數,将小數放在前面,大數放在後面(或者大在前,小在後)
	優點:穩定
	缺點:比較的數多,速度慢,每次隻能移動相鄰兩個資料,時間長,效率低

3、簡單選擇排序法:
	基本思想:每一趟從待排序的資料元素中選出最小(或最大)的一個元素,
		順序放在已排好序的數列的最後(最前),直到全部待排序的資料元素排完。
	優點:移動資料的次數已知(n-1次)。
	缺點:不是穩定的排序方法,比較次數多。
	
4、直接插入排序法:
	基本思想:将一個資料插入到已經排好序的有序資料中,進而得到一個新的、個數加一的有序資料 
	優點:是穩定的排序方法,速度較快。
	缺點:比較次數不一定,比較次數越少,插入點後的資料移動越多,特别是當資料總量龐大的時候,
		可連結清單可以解決這個問題。此算法适用于少量資料的排序。
*/

import java.util.Arrays;
 public class sortDemo{
	public static void main(String[] args){
		//列印排序前的數組
		sopArray(creatArray());
		
		//列印排序後的數組
		//fastSort(creatArray());//快速排序
		//bubbleSort(creatArray());//冒泡排序
		//selectSort(creatArray());//選擇排序法
		insertSort(creatArray());//插入排序法
	}
	
	//建立一個數組
	public static int[] creatArray(){
		int[] arr = new int[]{49,38,65,97,76,13,27,17,18,23,25,53,51};
		return arr;
	}
	
	//快速排序法
	public static void fastSort(int[] arr){
		Arrays.sort(arr);  //進行排序
		sopArray(arr);//列印數組
	}
	
	//冒泡排序法
	public static void bubbleSort(int[] arr){
		int temp = 0;
		for(int i = 0; i < arr.length-1; i++){//周遊arr.length-1次
			for(int j = 0; j < arr.length-1-i; j++){
				if(arr[j] > arr[j + 1]){//比較相鄰兩個數,并做調整
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
		sopArray(arr);//列印數組
	}
	
	//選擇排序法
	public static void selectSort(int[] arr){
		for(int i = 0; i < arr.length-1; i++){//周遊arr.length-1次
			int min = i;
			for(int j = i+1; j < arr.length; j++){
				if(arr[min] > arr[j]) min = j;//比較兩數的值,并調整下标
			}
			if(min != i){//判斷是否需要調整元素
				int temp = arr[i];
				arr[i] = arr[min];
				arr[min] = temp;
			}
		}
		sopArray(arr);//列印數組
	}
	
	//插入排序法
	public static void insertSort(int[] arr){
		for(int i =1; i < arr.length; i++){
			for(int j =i; j > 0; j--){
				if(arr[j] < arr[j-1]){
					int temp = arr[j-1];
					arr[j-1] = arr[j];
					arr[j] = temp;
				}
				else break;
			}
		}
		sopArray(arr);
	}
	
	//列印數組
	public static void sopArray(int[] arr){
		sop("[");
		for(int i = 0; i < arr.length; i++){
			if(i == arr.length - 1)
				sop(arr[i] + "]");
			else 
				sop(arr[i] + ",");
		}
		sop("\n");
	}
	
	//列印字元串
	public static void sop(String s){
		System.out.print(s);
	}
}