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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

常见的排序算法(1)

發布時間:2025/3/20 编程问答 8 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常见的排序算法(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?前言?

📘 博客主頁:to Keep博客主頁
🙆歡迎關注,👍點贊,📝留言評論
?首發時間:2022年2月27日
📨 博主碼云地址:博主碼云地址
📕參考書籍:java核心技術 卷1
📢編程練習:牛客網+力扣網
由于博主目前也是處于一個學習的狀態,如有講的不對的地方,請一定聯系我予以改正!!!

文章目錄

  • 🌍排序的相關概念:
  • 🌎插入排序
  • 🌏 希爾排序
  • 🌳 選擇排序
  • 🍀 堆排序
  • 🌱 冒泡排序
  • 源碼地址

🌍排序的相關概念:

1 排序:
就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。
2 穩定性:
兩個相等的數據,如果經過排序后,排序算法能保證其相對位置不發生變化,則我們稱該算法是具備穩定性的排序算法。
例如:

🌎插入排序

插入排序的核心思想就是把數組中的第一個數據是作為有序的,從第二個數據開始,就要與前面的數據進行比較,在合適的位置進行插入;
代碼如下:

public class TestSort {public static void main(String[] args) {int[] array = {12,23,43,52,24,64,78,0,1,4};InsertSort(array);System.out.println(Arrays.toString(array));}/***時間復雜度:O(N^2) 最好情況下O(N)* 空間復雜度:O(1)* 穩定性:穩定* @param array 待排序數組*/public static void InsertSort(int[] array){for (int i = 1; i <array.length ; i++) {//取出當前要進行比較的數據int tmp = array[i];//需要從i與前面的數據比較,就從最近的i-1開始int j = i-1;//j要大于等于零for (;j>=0;j--){//如果j位置上數據大于tmp,那么就需要將j+1上的數據覆蓋成j位置上的數據if(array[j]>tmp){array[j+1]=array[j];}else{//說明此時數據是有序的,直接退出循環break;}}//將tmp放在j+1位置上array[j+1]=tmp;}} }

**特點:**時間復雜度為O(N)是在數據有序的情況下,所以對于插入排序而言,數據越有序就越快!

🌏 希爾排序

希爾排序其實就是在插入排序的基礎上,進行了優化,它所利用的也是直接插入排序,但是它采用了數據分組的思想,接下來就簡單的來了解一下什么是希爾排序!
代碼如下:

public class TestSort {public static void main(String[] args) {int[] array = {12,23,43,52,24,64,78,0,1,4};ShellSort(array);System.out.println(Arrays.toString(array));}//交換元素位置public static void Swap(int[] array,int i,int j){int tmp = array[i];array[i]=array[j];array[j]=tmp;}/*** 時間復雜度:0(N^1.3)~O(N^1.5)* 空間復雜度:O(1)* 穩定性:不穩定* @param array 待排序序列*/public static void ShellSort(int[] array){int gap = array.length;while(gap!=1){Shell(array,gap);gap=gap/2;}Shell(array,1);}//插入排序public static void Shell(int[] array,int gap){for(int i=gap;i<array.length;i++){int tmp = array[i];int j = i-gap;for (;j>=0;j-=gap){if(array[j]>tmp){array[j+gap]=array[j];}else{break;}}array[j+gap]=tmp;}} }

🌳 選擇排序

選擇排序其實就是,每一次都要將數組中,最小的元素放置到第一位
代碼如下:

public class TestSort {public static void main(String[] args) {int[] array = {12,23,43,52,24,64,78,0,1,4};selection(array);System.out.println(Arrays.toString(array));}//交換元素位置public static void Swap(int[] array,int i,int j){int tmp = array[i];array[i]=array[j];array[j]=tmp;}/*** 時間復雜度:O(N^2)* 空間復雜度:O(1)* 穩定性:不穩定* @param array 待排序數組*/public static void selection(int[] array){for(int i = 0;i<array.length;i++){int minIndex = i;//假設最小值下標一開始是ifor(int j = i+1;j<array.length;j++){if(array[minIndex]>array[j]){minIndex=j;//找到最小值小標}}//如果不是i所在位置元素是最小,那么就要交換元素if(minIndex!=i){Swap(array,i,minIndex);}}} }

對于選擇排序而言,無論數組是否有序,時間復雜度都為O(N^2)!

🍀 堆排序

堆排序就是就是我們之前講過堆的調整。
代碼如下:

public class TestSort {public static void main(String[] args) {int[] array = {12,23,43,52,24,64,78,0,1,4};HeapSort(array);System.out.println(Arrays.toString(array));}//交換元素位置public static void Swap(int[] array,int i,int j){int tmp = array[i];array[i]=array[j];array[j]=tmp;}/*** 時間復雜度:O(N*logN)* 空間復雜度:O(1)* 穩定性:不穩定* @param array 待排序數組*/public static void HeapSort(int[] array){//調整建大堆for(int parent = (array.length-1-1)/2;parent>=0;parent--){shiftDown(array,parent,array.length);}//開始排序int end = array.length-1;while (end>0){//將最大的放到最后Swap(array,0,end);end--;//除去最大的之后,堆重新調整,對0位置調整shiftDown(array,0,end);}}public static void shiftDown(int[] array,int parent,int len){int child = 2*parent+1;while (child<len){//找到左右節點的最大值if(child+1<len&&array[child]<array[child+1]){child++;}if(array[child]>array[parent]){Swap(array,parent,child);parent=child;child=2*parent+1;}else{break;}}} }

堆的詳解

🌱 冒泡排序

冒泡排序的時間復雜度:O(N^2)
空間復雜度:O(1)
穩定性:穩定
圖解冒泡排序

源碼地址

總結

以上是生活随笔為你收集整理的常见的排序算法(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。