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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

插入排序最优_排序专题插入排序

發布時間:2025/3/12 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 插入排序最优_排序专题插入排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天開始,我計劃用幾篇專題來集中練習下有關排序的算法,排序算法是算法中最基礎的算法了,所以這部分我們是要盡可能的全都掌握了。排序算法最常見的有如下幾種:

  • 插入排序(Insertion Sort)

  • 選擇排序(Selection Sort)

  • 希爾排序(Shell Sort)

  • 冒泡排序(Bubble Sort)

  • 快速排序(Quick Sort)

  • 歸并排序(Merge Sort)

  • 堆排序(Heap Sort)

  • 計數排序(Counting Sort)

  • 桶排序(Bucket Sort)

  • 基數排序(Radix Sort)

廢話不多說了,開始今天的算法練習。

???今日練習(一)插入排序

?思路

插入排序從左到右進行,每次都將當前元素插入到左側已經排序的數組中,使得插入之后左部數組依然有序。第 j 元素是通過不斷向左比較并交換來實現插入過程:當第 j 元素小于第 j - 1 元素,就將它們的位置交換,然后令 j 指針向左移動一個位置,不斷進行以上操作。

private void sort(int[] nums){ int len =nums.length; if ( len< 2) { return nums; } for(int i=1;i for(int j=i;j>0;j--){ if(nums[j]< nums[j-1]){ int temp = nums[j]; nums[j]=nums[j-1]; nums[j-1]=temp; } } } return nums;}
???今日練習(二)希爾排序?思路希爾排序也是一種插入排序,它是簡單插入排序經過改進之后的一個更高效的版本,也稱為縮小增量排序,同時該算法是沖破O(n2)的第一批算法之一。它與插入排序的不同之處在于,它會優先比較距離較遠的元素。希爾排序又叫縮小增量排序。希爾排序是把數組按下標的一定增量間隙分組,對每組使用直接插入排序算法排序;隨著增量間隙逐漸縮小,每組包含的元素越來越多,當增量間隙減至1時,整個文件恰被分成一組,算法便終止。在此我們選擇增量gap=length/2,縮小增量繼續以gap = gap/2的方式,這種增量選擇我們可以用一個序列來表示,{n/2,(n/2)/2…1},稱為增量序列。希爾排序的增量序列的選擇與證明是個數學難題,我們選擇的這個增量序列是比較常用的,也是希爾建議的增量,稱為希爾增量,但其實這個增量序列不是最優的。此處我們做示例使用希爾增量,如圖:

看著上圖,結合代碼,大家最好能自己手寫下數組中元素的變化過程這樣理解的會更深刻,圖中僅展示出了增量不同時最終的變化情況,中間過程并不能體現。

代碼:public void shellSrot(int[] nums) { int len = nums.length; if (len < 2) { return; } int gap = len / 2; while (gap > 0) { for (int i = gap; i < len; i++) { int temp = nums[i]; int prevI = i - gap; while (prevI >= 0 && nums[prevI] > temp) { nums[prevI + gap] = nums[prevI]; prevI -= gap; } nums[prevI + gap] = temp; } gap = gap / 2; }}
???今日練習(三)選擇排序?思路

選擇出數組中的最小元素,將它與數組的第一個元素交換位置。再從剩下的元素中選擇出最小的元素,將它與數組的第二個元素交換位置。不斷進行這樣的操作,直到將整個數組排序。

public void selectSort(int[] nums){ int len=nums.length; if(len<2){ return; } for (int i=0;i<len-1;i++){ int min=i; for (int j=i+1;j<len;j++){ if(nums[j] min=j; } } int temp=nums[min]; nums[min]=nums[i]; nums[i]=temp; }}

不積跬步,無以至千里。

文章有幫助的話,點個轉發、在看唄。

謝謝支持喲 (*^__^*)

END

?

總結

以上是生活随笔為你收集整理的插入排序最优_排序专题插入排序的全部內容,希望文章能夠幫你解決所遇到的問題。

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