【排序算法】冒泡排序|选择排序|插入排序|希尔排序
文章目錄
- 冒泡排序
- 選擇排序
- 插入排序
- 希爾排序
冒泡排序
??第一個元素開始向第二個元素比較,若大于則交換位置,不大于則不動。然后第二個元素和第三個元素比較,再然后第三個元素和第四個元素比較…一直比到最后一個元素。這一趟下來,就把最大的元素放到了最后。
??然后又從第一個元素開始,開始第二趟…然后開始第三趟…一直走完最后一趟。
測試截圖
選擇排序
??先定義一個索引,把它指向第一個元素。讓第一個元素和第二個比較。若第二個小,就把索引指向第二個元素;若不是,索引不動。然后把索引指向的元素和第三個元素比較,更新索引位置。然后和第四個元素比較…以此類推,一直比到最后一個元素,然后把索引指向的元素和第一個元素換位置。這一趟下來就把最小的元素放到了最前面。
??然后就從第二個元素開始重復(fù)上述步驟,這一趟下來把第二小的元素放到了第二個位置…以此類推,直到最后一個元素。
??和冒泡排序相比,一趟下來,冒泡排序每一步都在交換位置;而選擇排序一趟只換了一次位置。
插入排序
??把一個數(shù)組視為有序列表和無序列表兩部分。
??初始來說,有序列表就是數(shù)組的第一個元素,后面的所有元素是無序列表,待插入元素就是數(shù)組第二個元素。我們要做的就是把無序列表的數(shù)一個一個放到有序列表里。
??走一輪,把第二個元素放入有序列表并比大小,有序列表就有兩個元素了。后面的所有元素是無序列表,待插入元素就是數(shù)組第三個元素,以此類推
??我們站在待插入元素的位置上看待問題,核心就是給待插入元素找位置。
測試截圖
希爾排序
??在插入排序的基礎(chǔ)上,先按步長先分組調(diào)位置,使得在插入排序前在宏觀上大致有序,提高了插入排序的效率。步長逐步縮小,叫做縮小增量。
package com.serein.sort;import java.util.Arrays;/*** @author baichuan* @version 1.0*/ public class ShellSort {public static void main(String[] args) { // int[] arr = {8,9,1,7,2,3,5,4,6,0};int[] arr = new int[80000];for (int i = 0; i < 80000; i++) {arr[i] = (int) (Math.random()*800000);}long millisStart = System.currentTimeMillis(); // shell(arr);shell2(arr);long millisEnd = System.currentTimeMillis();System.out.println("一共耗時:" + (millisEnd - millisStart) + " 毫秒");System.out.println("希爾牛皮!!!");System.out.println(Arrays.toString(arr));}private static void shell(int[] arr){int temp = 0;//交換元素需要的臨時變量,定義在循環(huán)外面可節(jié)省開銷//gap是步長,初始化為數(shù)組長度的一半,每次循環(huán)都讓步長減半。減到1組的時候循環(huán)會結(jié)束for (int gap = arr.length / 2;gap > 0;gap /= 2){//分出有多少組步長for (int i = gap; i < arr.length; i++) {//走一次就是判斷一組步長,因為i的變化會使得走完所有組for (int j = i - gap; j >= 0 ; j -= gap){//若前面的數(shù)大于步長后面的數(shù),則位置互換if (arr[j] > arr[j + gap]){temp = arr[j];arr[j] = arr[j + gap];arr[j + gap] = temp;}}}}}//上面那個是交換式希爾排序,由于交換次數(shù)較多,所以耗時也比較久。//以下采用移位式希爾排序//對比private static void shell2(int[] arr){for (int gap = arr.length / 2; gap > 0; gap /= 2){//分出有多少組步長for (int i = gap; i < arr.length; i++) {int j = i;int temp = arr[j];//定義臨時變量保存一組步長后面那個數(shù)//引入索引的概念,減少了交換次數(shù)。這是提高效率的核心!!! // if (arr[j] < arr[j - gap]){//如果后面那個數(shù)更小,就先把前面的數(shù)復(fù)制一份到后面那個數(shù)while (j - gap >= 0 && temp < arr[j - gap]){//上面的if判斷似乎多余,這里就起到了判斷一組步長前后元素大小的作用arr[j] = arr[j - gap];//讓j指向前面的數(shù)j -= gap;}//把原始后面那個數(shù)賦給步長前面那個數(shù)arr[j] = temp; // }}}} }總結(jié)
以上是生活随笔為你收集整理的【排序算法】冒泡排序|选择排序|插入排序|希尔排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【火炉炼AI】机器学习055-使用LBP
- 下一篇: 2021年10月语音合成和语音识别论文月