算法 - 排序算法 (算法学习)(冒泡、选择、插入、希尔、快排、归并)
生活随笔
收集整理的這篇文章主要介紹了
算法 - 排序算法 (算法学习)(冒泡、选择、插入、希尔、快排、归并)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1)冒泡排序
1.1 圖解演示
2)選擇排序
import java.text.SimpleDateFormat; import java.util.Date;/*** 選擇排序*/ public class chooseSort {public static void selectSort(int[] arr){for (int i = 0; i < arr.length; i++) {int minIndex = i;int min = arr[i];for (int j = i+1; j < arr.length; j++) {if (min > arr[j]){ //說(shuō)明最小值不是min,然后重置min = arr[j];minIndex = j;}}//交換arr[minIndex] = arr[i];arr[i] = min;}}public static void main(String[] args) {int arr [] = new int[80000];for (int i = 0; i < arr.length; i++) {arr[i] = (int)(Math.random() * 800000);}Date date1 = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd:HH:mm:ss");String data1Str = simpleDateFormat.format(date1);System.out.println("排序前時(shí)間:"+ data1Str);selectSort(arr);Date date2 = new Date();String date2Str = simpleDateFormat.format(date2);System.out.println("排序后時(shí)間:"+ date2Str);//System.out.println(Arrays.toString(arr));} }3)插入排序
4)希爾排序(插入排序改進(jìn)版)
在這里插入圖片描述
4.1希爾的交換法
import java.text.SimpleDateFormat; import java.util.Date;/*** 希爾排序(縮小增量排序),交換的速度并不快*/ public class SellSort {public static void sellSort(int [] arr){//第一輪排序?qū)?0個(gè)數(shù)據(jù)分成5組int temp = 0;int gap = arr.length/2;while(gap>=1) {for (int i = gap; i < arr.length; i++) {//遍歷各組中所有元素(共五組,每組兩個(gè)元素),步長(zhǎng)為5for (int j = i - gap; j >= 0; j -= gap) {//如果當(dāng)前元素大于加上步長(zhǎng)元素交換if (arr[j] > arr[j + gap]) {temp = arr[j];arr[j] = arr[j + gap];arr[j + gap] = temp;}}}gap = gap/2;}}public static void main(String[] args) {int [] arr = new int[80000];for (int i = 0; i < 80000; i++) {arr[i] = (int)(Math.random()*800000);}Date date1 = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd:HH:mm:ss");String format1 = simpleDateFormat.format(date1);System.out.println(format1);sellSort(arr);Date date2 = new Date();String format2 = simpleDateFormat.format(date2);System.out.println(format2);} }4.2希爾的移位法
import java.text.SimpleDateFormat; import java.util.Date;/*** 希爾排序(縮小增量排序),交換的速度并不快*///移位法public static void sellSort2(int [] arr){//第一輪排序?qū)?0個(gè)數(shù)據(jù)分成5組int temp = 0;int gap = arr.length/2;while(gap >= 1) {for (int i = gap; i < arr.length; i++) {int insertVal = arr[i];int insertIndex = i - gap;//移位找位置while(insertIndex >= 0 && arr[insertIndex] > arr[i]){arr[i] = arr[insertIndex];insertIndex -= gap;}//插入if (insertIndex + gap != i){arr[insertIndex+ gap] = insertVal;}}gap = gap/2;}}public static void main(String[] args) {int [] arr = new int[80000];for (int i = 0; i < 80000; i++) {arr[i] = (int)(Math.random()*800000);}Date date1 = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd:HH:mm:ss");String format1 = simpleDateFormat.format(date1);System.out.println(format1);sellSort2(arr);Date date2 = new Date();String format2 = simpleDateFormat.format(date2);System.out.println(format2);//System.out.println(Arrays.toString(arr));} }可以看到希爾排序的移位法的效率大大提高。當(dāng)你改成8w、80w都是可以1秒出結(jié)果,但是插入排序80w需要很長(zhǎng)時(shí)間大概幾分鐘。
5)快速排序
800w數(shù)據(jù)3秒
上面代碼聽(tīng)完課,研究一下午還是沒(méi)太懂尤其是遞歸那塊,于是又查了好多資料學(xué)習(xí)
package sort;import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date;public class QuickSort {public static void quickSort1(int[] arr, int start, int end) {//1.找到中軸getIndex()//2.左遞歸//3.右遞歸if (start < end) {int index = getIndex(arr, start, end);quickSort1(arr, start, index - 1);quickSort1(arr, index + 1, end);}}//找中軸又分為://1.取一個(gè)中軸,隨便取//2.(如果中軸是第一個(gè)位置)那么就先從右往左找,找到小于等于中軸的數(shù),然后把找到的數(shù)賦值給arr[start]//3.從左往右找,找到大于等于中軸的數(shù),把找到的數(shù)賦給arr[end]//4.最后再把pivot賦給arr[start]//5.返回startpublic static int getIndex(int[] arr, int start, int end){int pivot = arr[start];while (start < end){//從右往左找while (arr[end] >= pivot && start < end){end --;}arr[start] = arr[end];while(arr[start] <= pivot && start < end){start++;}arr[end] = arr[start];}arr[start] = pivot;return start;}public static void main(String[] args) {int[] arr = new int[]{-1,0,5,2,8,-1,0,0,0}; // for (int i = 0; i < 4; i++) { // arr[i] = (int)(Math.random()*800000); // }Date date1 = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd:HH:mm:ss");String format1 = simpleDateFormat.format(date1);System.out.println(format1);quickSort1(arr, 0, arr.length - 1);Date date2 = new Date();String format2 = simpleDateFormat.format(date2);System.out.println(format2);System.out.println(Arrays.toString(arr));} }6)歸并排序
總結(jié)
以上是生活随笔為你收集整理的算法 - 排序算法 (算法学习)(冒泡、选择、插入、希尔、快排、归并)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 油价传出好消息,刚小幅上涨后有可能大降?
- 下一篇: PWN-PRACTICE-BUUCTF-