插入排序最优_排序专题插入排序
今天開始,我計劃用幾篇專題來集中練習下有關排序的算法,排序算法是算法中最基礎的算法了,所以這部分我們是要盡可能的全都掌握了。排序算法最常見的有如下幾種:
插入排序(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
?
總結
以上是生活随笔為你收集整理的插入排序最优_排序专题插入排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言成绩管理系统开题报告,学生信息管理
- 下一篇: python怎么安装request_【p