數組的綜合應用 冒泡排序 為什麼這個排序要叫冒泡呢?為什麼不叫其他名詞呢? 其實這個取名是根據排序演算法的基本思路命名的,見名知意,冒泡排序,就是想泡泡在水裡一樣,在水裡大的泡泡先浮出水面,就是大的先排出來,最小的最慢排出。 冒泡排序,是對排序的各個元素從頭到尾依次進行相鄰的大小比較, 比如你是隊長, ...
數組的綜合應用
// 列印數組
public static void printArray(int[] arr)
{
for(int x=0;x<arr.length;x++)
{
if(x!=arr.length-1){
System.out.print(arr[x]+",");
}else{
System.out.print(arr[x]);
}
}
}
數組轉字元串
// 數組轉換成為字元串
// 結果返還為字元串,參數為數組
public static String toString (int[] arr){
// 定義字元串變數
String temp = "[";
for(int x = 0; x<arr.length; x++){
// 判斷是否為最後一位元素
if(x != arr.length - 1){
temp = temp + arr[x] + ",";
}else{
temp = temp + arr[x] + "]";
}
}
}
public static String getWeek(int num){
String[] weeks = { "1", "2", "3", "4", "5", "6", "7" };
if(num>7 || num<1){
return num + "沒有對應的星期";
}
return weeks[num];
}
選擇排序
選擇排序是第一個人和後續排序的人進行比較,若第一個人大於第二個人,就進行交換,那麼這時第一人就是最小的,然後這時的第一個人和第三個人進行比較,若這時的第一個人大於第三個人,就進行交換位置,這時第一個人又換人了,也變得更小了,就這樣,把剩下的人以這種方法進行比較,直到最後,第一輪結束,在第一位的就是最小的值。
這種就是排序演算法,比如有6個人,第一輪要進行5次比較。小的值往前跑嘛。
//第一輪
for(int index=1;index<arr.length;index++)
{
if(arr[0]>arr[index])
{
int temp = arr[0];
arr[0] = arr[index];
arr[index] = temp;
}
}
print(arr);
//第二輪
for(int index=2;index<arr.length;index++)
{
if(arr[1]>arr[index])
{
int temp = arr[1];
arr[1] = arr[index];
arr[index] = temp;
}
}
print(arr);
//第三輪
for(int index=3;index<arr.length;index++)
{
if(arr[2]>arr[index])
{
int temp = arr[2];
arr[2] = arr[index];
arr[index] = temp;
}
}
print(arr);
//第四輪
for(int index=4;index<arr.length;index++)
{
if(arr[3]>arr[index])
{
int temp = arr[3];
arr[3] = arr[index];
arr[index] = temp;
}
}
print(arr);
//第五輪
for(int index=5;index<arr.length;index++)
{
if(arr[4]>arr[index])
{
int temp = arr[4];
arr[3] = arr[index];
arr[index] = temp;
}
}
print(arr);
//第六輪沒有,我們arr.length=6舉例
//int index = 6;index<arr.length; false
優化:
public static void selectionSort(int[] arr)
{
for(int count=1;count<arr.length;count++)
{
for(int index=count;index<arr.length;index++)
{
if(arr[count-1]>arr[index])
{
int temp = arr[count-1];
arr[count-1] = arr[index];
arr[index] = temp;
}
}
}
for(int x = 0;x<arr.length-1;x++)
{
for(int y=x+1;y<arr.length;y++){
if(arr[x]>arr[y]){
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
冒泡排序
為什麼這個排序要叫冒泡呢?為什麼不叫其他名詞呢?
其實這個取名是根據排序演算法的基本思路命名的,見名知意,冒泡排序,就是想泡泡在水裡一樣,在水裡大的泡泡先浮出水面,就是大的先排出來,最小的最慢排出。
冒泡排序,是對排序的各個元素從頭到尾依次進行相鄰的大小比較,比如你是隊長,在你的面前有一排人,你要將其進行排序,依次按照從小到大排序。
怎麼理解最大的值被排除,你是隊長,你對面前的一群人看不慣,進行排序,從左到右開始,第一個和第二個進行比較,大的那個就被挑出來,與第三個進行比較,接下來就是依次按照這個方法比較,就能把那個最大的值,最高的給挑出來不是,這就是第一輪的比較。
接下來,最大的就不用跟他比較了,上面所述,在排序時,你面前的人,是不能亂動的,一旦比較哪個大,兩者就換位,如果第一比第二個小,就是第二個大時,兩者不用換位,第二個就與第三個進行比較。
依照這個方法,兩兩比較,大的都被排到了最後,那麼一旦排完,是不是都依照從小到大,(從低到高)的順序在你面前排好了。
代碼示例
我們用索引下標來解釋
//第一輪
for(int index=0;index < arr.length-1; index++){
//相鄰兩個比較
if(arr[index] > arr[index+1]){
int temp = arr[index];
arr[index] = arr[index+1];
arr[index+1] = temp;
}
}
print(arr);
for(int index=0;index < arr.length-2;index++){
//這裡arr.length-2,為什麼比上一次多減了1呢?
//因為第一輪,把最大的排出來了,就不用比較了,少了一個人
if(arr[index] > arr[index+1]){
int temp = arr[index];
arr[index] = arr[index+1];
arr[index+1] = temp;
}
}
print(arr);
for(int index=0;index < arr.length-3;index++){
if(arr[index]>arr[index+1]){
int temp = arr[index];
arr[index] = arr[index+1];
arr[index+1] = temp;
}
}
print(arr);
優化:
for(int num=1;num<arr.length;num++){
for(int index=0;index<arr.length-num;index++){
if(arr[index]>arr[index+1]){
int temp = arr[index];
arr[index] = arr[index+1];
arr[index+1] = temp;
}
}
}
for(int x=0;x<arr.length-1;x++){
for(int y=0;y<arr.length-1-x;y++){
if(arr[y]>arr[y+1]){
int temp = arr[y];
arr[y] = arrp[y+1];
arr[y+1] = temp;
}
}
}
二分查找,折半查找
什麼是二分查找,折半查找呢?就是我說一個數,你來猜,你答一個數,我說大了,或小了,直到找到為止。
public static int searchKey(int[] arr, int key){
for(int x=0;x<arr.length;x++){
if(arr[x] == key){
rerurn x;
}
return -1;
}
}
二分
public static int binarySearch(int[] arr, int key){
int max,min,mid;
min = 0;
max = arr.length - 1;
mid = (max+min)>>1;
while(arr[mid] != key){
if(key>arr[mid]){
min = mid + 1;
}else if(key<arr[mid])
max = mid - 1;
mid = (max+min)>>1;
}
return mid;
}
}
public static int binarySearch(int[] arr, int key){
int max, min , mid;
min = 0;
max = arr.length - 1;
while(min <= max){
mid = (min+max)>>1;
if(key>arr[mid]){
min = mid + 1;
}else if(key < arr[mid])
max = mid - 1;
} else {
return mid;
}
return -1;
}
二維數組
格式:
int[][] arr = new int[2][3];
int[][] arr = { {3,5,6}, {33,44,66}, {23,21,6} };
for(int x=0; x<arr.length; x++){
for(int y=0; y<arr[x].length; y++){
sum += arr[x][y];
}
}
public static void revese(int[] arr){
for(int start=0, end = arr.length-1; start<end; start++,end--){
swap(arr,start,end);
}
}
public static void swap(int[] arr, int a, int b){
int temp=arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
結語
- 本文主要講解 Java語言基礎-講解數組的綜合應用
- 下麵我將繼續對
Java
、Android
中的其他知識 深入講解 ,有興趣可以繼續關註 - 小禮物走一走 or 點贊