--數組的排序和查找--java學習日記2(基礎知識)


      數組是一個相同數據類型的元素按照一定順序排列的集合。數組的特點:1.只能存放基本數據類型元素。2.數組長度固定,不可改變。3.同一個數組中元素類型相同。

數組的聲明:數據類型[]  數組名 =  new  數據類型[count];如: int []  a = new int[10];其中,數據類型指明數組中要存放的元素的類型,數組名用來唯一標識數組,它是數組第一個元素的地址,count代表數組長度。

      將數據保存到數組中是爲了對數據進行操作,比如將數組元素按一定規則排序,查找某個特定元素的位置等。常見的排序算法有:冒泡排序,選擇排序,插入排序等。效率較高的查找方式是折半查找。下面通過數組a進行說明。

       運用到的java基礎知識:數組,排序算法,流程語句控制,位運算等。

       一、排序 

1.冒泡排序

       原理:相鄰兩個元素進行比較,第一圈最值出現了最後位

     代碼示例如下:

public void bubbleSort(int[] a)
{
	for(int i = 0;i < n-1;i++)
	{
		boolean flag = true;// 判斷是否進行了交換
		// -i;讓每一次比較的元素減少,-1;防止角標越界
		for(int j = i+1;j < n-i-1;j++)
		{
			if(a[j] > a[j+1])
			{
				swap(a[j],a[j+1]);// 兩個元素交換位置
				// swap(int[] a, int x, int y);
				flag = false;
			}
		}
		if(flag)// 如果本次沒有進行交換則退出,減少循環次數
			break;
	}
}

 

2.選擇排序

      原理:兩兩比較,每次選最小的放左邊

public void selectSort(int[] a)
{
	for(int i = 0;i < n-1;i++)// 從a[0]開始
	{
		for(int j = i+1;j < n;j++)// 從a[i]的下一個開始
		{
			if(a[i] > a[j])// 選最小的和a[i]互換
				swap(a[i],a[j]);
		}
	}
}


3.插入排序

      原理:認爲第一個元素是有序的,後面每插入一個元素都跟原數組中的元素進行比較

public void insertSort(int[]a)
{
	for(int i = 1;i < a.length;i++) 
	{
		for(int j = i;j > 0;j--)
		{
			if(a[j]<a[j-1])
			{
				swap(a[j],a[j-1]);
			}
		}
	}
}


 

以上排序算法中,swap(int x,int y);爲一個交換x, y的函數,實現方式很多,下面給出三種實現:

// 第一種,最常用
public void swap(int x, int y)
{
	int temp = x;
	x = y;
	y = temp;
}
 
// 第二種
public void swap(int x, int y)
{
	x = x + y;
	y = x - y;
	x = x - y;
}

// 第三種,效率最高,不容易想到
public void swap(int x, int y)
{
	x = x^y;
	y = x^y;
	x = x^y;
}


二、折半查找

         前提:數組必須有序才能用折半查找。將要查找的數與數組中間的數比較,如果小於要查找的數,則從右半部分查找,否則從左半部分查找。相等時返回下標,若要查找的數不存在返回-1 。

	public static int halfSearch(int[] a, int key)// key爲要查找的數
	{
		int min,max,mid;// min,max,mid分別表示最小、最大、中間值的索引
		min = 0;
		max = a.length-1;
		mid = (max + min)/2;
		while(a[mid] != key)
		{
			if(key>a[mid])// 要查找的數大於中間值,從右半部分查找
				min = mid+1;
			else if(key<a[mid])// 要查找的數大於中間值,從左半部分查找
				max = mid - 1;
			if(min > max)// 要查找的數不存在返回-1
				return -1;
			mid = (max + min)/2;
		}
		return mid;
	}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章