日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

算法 - 排序算法 (算法学习)(冒泡、选择、插入、希尔、快排、归并)

發(fā)布時(shí)間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法 - 排序算法 (算法学习)(冒泡、选择、插入、希尔、快排、归并) 小編覺(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)插入排序



import java.text.SimpleDateFormat; import java.util.Date;public class InsertSort {public static void insertSort(int [] arr){for (int i = 1; i < arr.length; i++) {int insertVal = arr[i];int insertIndex = i-1;//arr[1]前面這個(gè)數(shù)的下標(biāo)//給insertVal找到插入位置//insertIndex>=0保證給insertVal插入的位置不越界//insertVal < arr[insertIndex]待插入的數(shù),還沒(méi)有找到插入的位置//就需要arr[insertIndex]后移while(insertIndex >= 0 && insertVal < arr[insertIndex]){arr[insertIndex+1] = arr[insertIndex];insertIndex --;}//出來(lái)就是找到插入的位置,即insertIndex+1arr[insertIndex+1] = insertVal;}}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);insertSort(arr);Date date2 = new Date();String format2 = simpleDateFormat.format(date2);System.out.println(format2);//System.out.println(Arrays.toString(arr));} }

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)快速排序



package sort;import java.text.SimpleDateFormat; import java.util.Date;public class QuickSort {public static void quickSort(int [] arr,int left,int right){int l = left; //左下標(biāo)int r = right; //右下標(biāo)int pivot = arr[(left+right)/2];//while循環(huán)的目的是讓比pivot小的放到左邊,大的放到右邊int temp = 0;while (r > l){while (arr[l] < pivot){ //在pivot左邊一直找,找到大于等于pivot的值l += 1;}while(arr[r] > pivot){//在pivot右邊一直找,找到小于等于pivot的值r -= 1;}//如果l>=r成立,說(shuō)明排序成功if (l >= r){break;}//交換temp = arr[l];arr[l] = arr[r];arr[r] = temp;//交換完成后發(fā)現(xiàn)值arr[l] = pivot,需要往前再走一步if (arr[l] == pivot){l++;}//交換完成后發(fā)現(xiàn)值arr[r] = pivot,需要往前再走一步if (arr[r] == pivot){r--;}}//如果l == r,必須讓l++,r--,否則死循環(huán)出不去if (l == r){l++;r--;}//向左遞歸if (left < r){quickSort(arr,left,r);}//向右遞歸if (right > l){quickSort(arr,l,right);}}public static void main(String[] args) {int [] arr = new int[8000000];for (int i = 0; i < 8000000; i++) {arr[i] = (int)(Math.random()*80000000);}Date date1 = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd:HH:mm:ss");String format1 = simpleDateFormat.format(date1);System.out.println(format1);quickSort(arr,0,arr.length-1);Date date2 = new Date();String format2 = simpleDateFormat.format(date2);System.out.println(format2);//System.out.println(Arrays.toString(arr));} }

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)歸并排序


package sort;import java.util.Arrays;public class MergeSort {/**** @param arr 排序的原始數(shù)組* @param start 左邊初始索引* @param end 右邊初始索引* @param mid 中間索引* @param temp 中轉(zhuǎn)的數(shù)組*/public static void merge(int[] arr, int start, int end, int mid,int[] temp){int i = start; //初始化i,左邊有序序列的初始索引int j = mid + 1; //初始化j,右邊有序序列的初始索引int t = 0; //指向temp數(shù)組的當(dāng)前索引//(1)//先把左右兩邊(有序)的數(shù)據(jù)按照規(guī)則填充到temp數(shù)組//直到左右兩邊的有序序列,有一邊處理完畢while (i <= mid && j <= end){//如果左邊有序序列的當(dāng)前元素,小于等于右邊有序序列的當(dāng)前元素//即將左邊的當(dāng)前元素,拷貝到temp數(shù)組//然后t++,i++if (arr[i] <= arr[j]){temp[t] = arr[i];t++;i++;}else {//反之,右邊有序序列當(dāng)前元素小于左邊,將右邊有序序列當(dāng)前元素拷貝到temptemp[t] = arr[j];t++;j++;}}//(2)//把有剩余數(shù)據(jù)的一邊的數(shù)據(jù)依次填充到tempwhile (i <= mid){//說(shuō)明左邊有序序列剩余元素還有剩余,全部填充到temptemp[t] = arr[i];t++;i++;}while (j <= end){//說(shuō)明右邊有序序列剩余元素還有剩余,全部填充到temptemp[t] = arr[j];t++;j++;}//(3)//將temp元素拷貝到arr//注意并不是每次都拷貝所有t = 0;int tempLeft = start;//while (tempLeft <= end){//第一次合并tempLeft = 0;right = 1arr[tempLeft] = temp[t];t++;tempLeft ++;}}//分+合方法public static void mergeSort(int[] arr,int start,int end,int[] temp){if (start < end){int mid = (start+end)/2; //中間索引//向左遞歸進(jìn)行分解mergeSort(arr,start,mid,temp);//向右遞歸進(jìn)行分解mergeSort(arr,mid+1,end,temp);//合并merge(arr, start,end,mid,temp);}}public static void main(String[] args) {int arr[] = {8,4,5,7,1,3,6,2};int temp[] = new int[arr.length];//歸并排序需要一個(gè)額外空間mergeSort(arr,0,arr.length-1,temp);System.out.println(Arrays.toString(arr));} }

總結(jié)

以上是生活随笔為你收集整理的算法 - 排序算法 (算法学习)(冒泡、选择、插入、希尔、快排、归并)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。