資料結構---排序
阿新 • • 發佈:2018-12-09
1、有序陣列二分查詢
首先設定判斷要找的資料為key,判斷其是否在 陣列的中間即a.length/2的位置,即key=a[a.length/2] 如果在直接返回。如果不在則迴圈獲取,重要的一點,中間元素的值為mid = start + (start + end)/2。 判斷如果key在mid位置則 返回,如果key>a[mid] 則start=mid +1;反之則為end = mid -1; 核心程式碼如下:
//如果在有序陣列的中間直接返回
int mid=a.length/2;
if (key==a[mid]) {
return mid;
}
int start=0;
int end=a.length-1;
while (start <= end) {
//每次定位中間位置
mid = start+(end-start)/2;
if(key == a[mid]){
return mid;
}else if(key > a[mid]){
start = mid +1;
}else{
end = mid-1 ;
}
}
return -1;
//遞迴查詢
private static int binSearch(int[] a, int start,int end,int key){
int mid = (end - start)/2 +start;
if(a[mid] == key){
return mid;
}else if(start >= end){
return -1;
}else if(a[mid] > key ){
return binSearch(a, start,mid -1,key);
}else{
return binSearch(a,mid + 1, end,key);
}
}
2、氣泡排序 氣泡排序是簡單排序裡面效率最小的一種排序方式,假如有n個數據,外層迴圈n-1次。每次相比較n-i次,重點在於:如果a[j]>a[j+1],則快取temp=a[j+1],交換a[j]和a[j+1],核心程式碼如下:
//外層迴圈控制排序趟數(n-1)趟
for (int i = 0; i < a.length -1 ; i++) {
for (int j = 0; j < a.length -1 -i; j++) { //每一趟排序多少次n - i趟
if(a[j]>a[j+1]){
long temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
3、選擇排序 選擇排序 效率比氣泡排序的效率高一些,主要思想是當前的資料記錄為最小值min和接下來的資料做對比,如果接下來的資料比當前的小,則記錄此資料為最小值,接著向下比較,每一次迴圈找到一個數據最小的值,交換。核心程式碼如下
//外層迴圈控制排序趟數(n-1)趟
int in,out,min;
for (out = 0; out < mElement ; out++) {
min = out;
for (in = out+1; in < mElement; in++) { //從下一個資料開始
if(a[in]<a[min]){
min = in;
}
}
long temp = a[out];
a[out] = a[min];
a[min] = temp;
}
4、插入排序 定義一個臨時儲存的變數,將資料列表中第二個資料放入零時變數中,然後依次和它之前的資料比較,前一條資料如果大於等於temp的話移動,否則不移動。 定義一個臨時變數為temp, 核心程式碼如下:
//插入排序 --將第二個資料放入零時變數中,往取出資料的當前位置往前移動, 比較大小,放入相應的位置
int out,in;
for (out = 1; out <mElement; out++) {
long temp = a[out];
in = out;
while( in >0 && a[in-1]>=temp){ //往前迴圈, 判斷為:in不能越界, 前一條資料如果大於等於temp的話移動。 否則不移動
a[in] = a[in-1];
in--;
} //至此就移動結束
a[in]=temp;
}