排序演算法(不定時更新~)
阿新 • • 發佈:2018-12-25
插入排序:
/** * 插入排序 * 初始時,拿第二個和第一個比較,如果第二個小於第一個,兩個交換 * 當進行到第N次時,前面的N-1個順序應該是正確的 * 拿第N個和前面的N-1個數比較,如果第M個小於N,M+1大於N,則把N插到M和M+1中間 * 相當於將N和前一個數比較,如果前一個數大於N,則把前一個移動到N的位置上,內層的每個迴圈都是將大於N的數字在向後移以為,也就相當於是將N插在兩個之間。 * * 時間複雜度:n+(n-1)+(n-2)+...+1 = (n+1)n/2=n^2 O(n^2) 空間複雜度:O(1) 穩定 * @Title: insertionSort * @author: wanglh3 * @Description: TODO * @param numbers * @return void */ public static void insertionSort(int[] numbers){ for(int i=1;i < numbers.length;i++){ int temp = numbers[i]; int j = i-1; for(; j >=0 && numbers[j]>temp ;j--){ if(temp < numbers[j]){ numbers[j+1] = numbers[j]; } } System.out.println(j+"----"+temp); numbers[j+1] = temp; } }
二分排序演算法應該是插入排序的優化演算法,插入時不從一端查詢,而是從中間開始查詢。
氣泡排序
/** * 氣泡排序 * 從後往前,先把最小的移到第一位,然後迴圈,把次小的移到第二位 * 氣泡排序法的改進: * 1.設定一個標誌變數,如果某一次排序中,沒有進行交換,就可以停止排序 * 2.設定一個記錄,標誌某位之後都已經進行排序,之後排序時,無需對之後的元素進行比較 * 3.正向逆向同時排序 * * 時間複雜度:O(n^2) 空間複雜度O(1) 穩定 * @Title: bubbleSort * @author: wanglh3 * @Description: TODO * @param numbers * @return void */ public static void bubbleSort(int[] numbers){ for(int i = 1; i < numbers.length; i++){ for(int j = numbers.length-1; j >= i; j--){ if(numbers[j] < numbers[j-1]){ int temp = numbers[j]; numbers[j] = numbers[j-1]; numbers[j-1] = temp; } } } }
選擇排序
快速排序/** * 選擇排序 * 從未排序的數中,選出最小的,與未排序的第一個數值交換 * 改進方法:二元選擇排序 * 每次迴圈選出最大的和最小的,最小的和前面的交換,最大的和後面的交換 * 時間複雜度:O(n^2) 空間複雜度O(1) 不穩定 * @Title: selectionSort * @author: wanglh3 * @Description: TODO * @param numbers * @return void */ public static void selectionSort(int[] numbers){ for(int i = 0; i < numbers.length-1; i++){ int index = i; int temp = numbers[i]; for(int j=i+1;j<numbers.length;j++){ if(numbers[j]<temp){ temp = numbers[j]; index = j; } } numbers[index] = numbers[i]; numbers[i] = temp; } }
/**
* 快速排序
* 選擇一個基準,比他大的,都放到他後面,比他小的,都放到他前面
* 平均時間複雜度是O(nlogn),空間複雜度是O(logn) 不穩定
* @Title: quickSort
* @author: wanglh3
* @Description: TODO
* @param numbers
* @return void
*/
public static void quickSort(int[] numbers){
_quickSort(numbers,0,numbers.length-1);
}
public static void _quickSort(int[] numbers,int low,int high){
if(low < high){
int _low = partition(numbers,low,high);
_quickSort(numbers,low,_low-1);
_quickSort(numbers,_low+1,high);
}
}
//{3,7,9,4,2,8,0,1,5}
public static int partition(int[] numbers,int low,int high){
int privotKey = numbers[low];//基準數
while(low < high){
//如果num[high]>pri num[low] = num[high]
//high--
//
while(low < high && numbers[high]>=privotKey){
high--;//當高位大於基準值時,一直向前移動,直到碰到小於基準值的,跳出迴圈,將高位賦值給低位
}
numbers[low] = numbers[high];
while(low < high && numbers[low] <= privotKey){
low++;
}
numbers[high]=numbers[low];
System.out.println();
}
numbers[low] = privotKey;
return low;
}
//------------快排end----------------