初級排序演算法

2021-08-07 10:34:34 字數 1927 閱讀 2276

回顧之前學習的各種排序演算法,從初級到高階,包括選擇排序,氣泡排序,插入排序,希爾排序,快速排序,歸併排序,堆排序等等,持續更新中…

注:這裡實現的演算法都是遞增排序,也就是從小到大排序。

思想:首先,找到陣列中最小的那個元素,其次,將它和陣列的第乙個元素交換位置(如果第乙個元素就是最小元素那麼它就和自己交換)。再次,在剩下的元素中找到最小的元素,將它與陣列的第二個元素交換位置。如此往復,直到將整個陣列排序。

public

static

int sort(int a,int length)

}int tem = a[i];

a[i] = a[minindex];

a[minindex] = tem;

}return a;

}

思想:每一步將乙個待排序的記錄,插入到前面應排好序的有序序列中去,直到查完所有元素為止。

**:

第一種:從後往前依次比較前面排好序的有序序列,如果插入元素較小時,交換,j- -,繼續比較。

public

static

int sort(int a,int length)

}return a;

}

第二種:不需要交換的直接插入排序,將內迴圈中較大的元素都向右移動而不總是交換兩個元素,從而提高效率。

public

static

int sort(int a,int length)

a[j+1] = tem; //將帶插入元素插入到查詢到的位置

}return a;

}

第三種:此外還可以通過增加哨兵的形式,在插入排序的實現中先找出最小的元素並將其置於陣列的最左邊,這樣就能去掉內迴圈的判斷條件j>0。這是一種常見的規避邊界測試的方法,能夠省略判斷條件的元素通常被稱為哨兵。

public

static

int sort(int a,int length)

}int tem = a[0];

a[0] = a[minindex];

a[minindex] = tem;

for(int i=2;iint j;

for(j=i-1;tem1] = a[j];

}a[j+1] = tem;

}return a;

}

簡單插入排序很循規蹈矩,不管陣列分布是怎麼樣的,依然一步一步的對元素進行比較,移動,插入,比如[5,4,3,2,1,0]這種倒序序列,陣列末端的0要回到首位置很是費勁,比較和移動元素均需n-1次。而希爾排序在陣列中採用跳躍式分組的策略,通過某個增量將陣列元素劃分為若干組,然後分組進行插入排序,隨後逐步縮小增量,繼續按組進行插入排序操作,直至增量為1。希爾排序通過這種策略使得整個陣列在初始階段達到從巨集觀上看基本有序,小的基本在前,大的基本在後。然後縮小增量,到增量為1時,其實多數情況下只需微調即可,不會涉及過多的資料移動。

我們來看下希爾排序的基本步驟,在此我們選擇增量gap=length/2,縮小增量繼續以gap = gap/2的方式,這種增量選擇我們可以用乙個序列來表示,,稱為增量序列。希爾排序的增量序列的選擇與證明是個數學難題,我們選擇的這個增量序列是比較常用的,也是希爾建議的增量,稱為希爾增量,但其實這個增量序列不是最優的。此處我們做示例使用希爾增量。

**:

public

static

int sort(int a,int length)

}h = h/2; //每次排完序後,增量減少

}

return a;

}

參考:dreamcatcher-c

初級排序演算法

排序模板 public class example private static boolean less comparable v,comparable w private static void exch comparable a,int i,int j private static void ...

初級排序演算法(二)

1.選擇排序的遞迴實現 public static void choosesortrecursion int arr public static void recursion int arr,int index recursion arr,index 選擇排序是從位置0開始選擇最小的元素,每個位置的...

演算法之初級排序

講排序之前先來幾個簡單的函式 交換函式 public static void swap comparable a,int i,int j 小於函式 public static boolean less comparable v,comparable w 首先找到陣列中的最小元素,將它和陣列的第乙個元...