幾種基礎的排序方法
阿新 • • 發佈:2018-11-26
寫排序demo要在test裡新建class 不是在main裡
想要在控制檯列印 需要加test註解
氣泡排序
package com.jia.mysort;
import org.junit.Test; /** * 氣泡排序 */ public class MyBubble { @Test public void bubbleSort(){ //定義一個數組 int []source = {2,8,6,1,9,4,5}; //外層,用於記錄和控制第幾輪迴圈 for (int i = 0; i < source.length-1; i++) { //內層,用於控制每輪迴圈的次數 for (int j = 0; j < source.length-1-i; j++) { //如果前面的數大於後面的數,則交換位置 if(source[j]>source[j+1]){ int temp = source[j]; source[j]=source[j+1]; source[j+1]=temp; } } } //迴圈輸出 for (int i = 0; i < source.length; i++) { System.out.print(source[i]+" "); } }
}
簡單選擇排序
package com.jia.mysort;
import org.junit.Test; public class MySelect { @Test /** * 簡單選擇排序 */ public void selectSort(){ int []source = {5,2,1,3,6,4,9}; //外層,用於控制第幾輪迴圈 for (int i = 0; i < source.length - 1; i++) { // 內層,用於控制每輪迴圈次數 for (int j = i+1; j < source.length; j++) { //如果第i個數大於後面的數,則交換位置 if(source[i]>source[j]){ int temp = source[i]; source[i] = source[j]; source[j] = temp; } } } for (int i = 0; i < source.length; i++) { System.out.print(source[i]+" "); } }
}
二分法查詢
一定要是在排好序的情況下進行查詢
在test裡寫demo時要用system.out.print進行輸出 而不是用log列印
package com.jia.mysort; import android.util.Log; import org.junit.Test; /** * 二分法查詢 * @return */ public class MyDichotomy { @Test public void twoPointQuery(){ int []source = {1,2,3,4,5,6}; int num = 5;//查詢5的索引 int start = 0;//查詢的起始角標 int end = source.length-1;//查詢的結尾角標 int mid = (start+end)/2;//查詢的中間角標 while (num!=source[mid]){ if(source[mid]>num){ end = mid-1; }else if (source[mid]<num){ start = mid+1; } //防止死迴圈 if(start>end){ mid = -1;// -1代表沒有這個數字 break; } mid = (start + end)/2; } // 迴圈結束的時候,mid的值即為要查詢的角標值 System.out.print("要查詢的num的角標為:"+mid); }
}
快速排序
package com.jia.mysort;
import org.junit.Test;
public class MyQuick {
@Test
public void quick(){
int[] list = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
System.out.println("************快速排序************");
System.out.println("排序前:");
display(list);
System.out.println("排序後:");
quickSort(list, 0, list.length - 1);
display(list);
}
/**
* 快速排序演算法
*/
public static void quickSort(int[] list, int left, int right) {
if (left < right) {
// 分割陣列,找到分割點
int point = partition(list, left, right);
// 遞迴呼叫,對左子陣列進行快速排序
quickSort(list, left, point - 1);
// 遞迴呼叫,對右子陣列進行快速排序
quickSort(list, point + 1, right);
}
}
/**
* 分割陣列,找到分割點
*/
public static int partition(int[] list, int left, int right) {
// 用陣列的第一個元素作為基準數
int first = list[left];
while (left < right) {
while (left < right && list[right] >= first) {
right--;
}
// 交換
swap(list, left, right);
while (left < right && list[left] <= first) {
left++;
}
// 交換
swap(list, left, right);
}
// 返回分割點所在的位置
return left;
}
/**
* 交換陣列中兩個位置的元素
*/
public static void swap(int[] list, int left, int right) {
int temp;
if (list != null && list.length > 0) {
temp = list[left];
list[left] = list[right];
list[right] = temp;
}
}
/**
* 遍歷列印
*/
public static void display(int[] list) {
System.out.println("********展示開始********");
if (list != null && list.length > 0) {
for (int num : list) {
System.out.print(num + " ");
}
System.out.println("");
}
System.out.println("********展示結束********");
}
}