七大基於比較的排序

2021-09-27 10:43:05 字數 3860 閱讀 6718

就是使一串記錄,按照其中的某個關鍵字的大小,遞增或遞減排列起來的操作。通常意義上的排序,指的是原地排序(公升序)。

穩定性:兩個相等的資料,如果經過排序後,排序演算法能保證其相對位置不發生變化,則稱該演算法是具備穩定性的排序。

例如:9    5(a)    4    6    5(b)    0,排序後為:4    5(a)    5(b)    6    9

1.直接插入排序:將整個區間分為無序區間(後面)和有序區間(前面的部分),每次選擇無序區間的第乙個元素,插入在有序區間合適的位置。

//  直接插入排序。時間複雜度最壞o(n^2),最好o(n)。空間複雜度o(1)

// 思路:前面為有序(從後往前判斷),後面為無序,(從前往後遍歷)

public static void insertsort(int array)

array[j + 1] = key;// 將 key 值放到他該在的位置}}

折半插入排序:在有序區間選擇合適的位置插入時,由於元素已經有序,所以可以利用折半查詢的思想。

public static void binaryinsertsort(int array)else

}for(int j = i;j > left;j--)

array[left] = key;}}

2.希爾排序:又稱縮小增量法。

希爾排序法的基本思想是:先選定乙個整數,把待排序檔案中所有記錄分成個組,所有距離為的記錄分在同一組內,並對每一組內的記錄進行排序。然後,取,重複上述分組和排序的工作。當到達=1時,所有記錄在統一組內排好序。

1. 希爾排序是對直接插入排序的優化。

2. 當gap > 1時都是預排序,目的是讓陣列更接近於有序。當gap == 1時,陣列已經接近有序的了,這樣就會很快。這樣整體而言,可以達到優化的效果。

// 希爾排序:分組對資料進行預處理

public static void shellsort(int array)

array[j + gap] = key;

}if(gap == 1)}}

3.直接選擇排序:每一次從無序區間選出最大(或最小)的乙個元素,存放在無序區間的最後(或最前),直到全部待排序的資料元

素排完 。

//每次選擇最大的元素放到無序區間的最後面,無序在前,有序在後

public static void selectsort1(int array)

}swap(array,array.length - 1 - i,max);}}

//每次選擇最小的元素放到無序區間的最前面,有序在前,無序在後

public static void selectsort2(int array)

}swap(array,min,i);}}

public static void swap(int array,int a,int b)

雙向選擇排序:每一次從無序區間選出最小 + 最大的元素,存放在無序區間的最前和最後,直到全部待排序的資料元素排完 。

public static void selectsortop(int array)

if(array[i] < array[min])

}swap(array, min, begin);

if(max == begin)

swap(array,max,end);

begin++;

end--;}}

4.堆排序:基本原理也是選擇排序,只是不在使用遍歷的方式查詢無序區間的最大的數,而是通過堆來選擇無序區間的最大的

數。注意: 排公升序要建大堆;排降序要建小堆。

// 堆排序

public static void heapsort(int array)

}// 建立大根堆

private static void createheapbig(int array)

}// 向下調整

private static void shiftdownbig(int array, int index, int size)

if(array[index] >= array[max])

swap(array,index,max);

index = max;

left = index * 2 + 1;}}

5.氣泡排序:在無序區間,通過相鄰數的比較,將最大的數冒泡到無序區間的最後,持續這個過程,直到陣列整體有序。

// 氣泡排序:相鄰數比較,將大的放在後面

public static void bubblesort(int array)

}if (issorted) }}

6.快速排序:1. 從待排序區間選擇乙個數,作為基準值(pivot);

2. partition: 遍歷整個待排序區間,將比基準值小的(可以包含相等的)放到基準值的左邊,將比基準值大的

(可以包含相等的)放到基準值的右邊;

3. 採用分治思想,對左右兩個小區間按照同樣的方式處理,直到小區間的長度 == 1,代表已經有序,或者小區

間的長度 == 0,代表沒有資料。

public static void quicksort(int array)

private static void quicksortinter(int array, int left, int right)

//int pivotindex = partition1(array,left,right);

//int pivotindex = partition2(array,left,right);

int pivotindex = partition3(array,left,right);

quicksortinter(array,left,pivotindex - 1);

quicksortinter(array,pivotindex + 1,right);

}// hoare法

private static int partition1(int array, int left, int right)

while(i < j && array[i] <= pivot)

swap(array,i,j);

}swap(array,i,left);

return i;

}private static void swap(int array, int i, int j)

// 挖坑法

private static int partition2(int array,int left,int right)

array[i] = array[j];

while(i < j && array[i] <= pivot)

array[j] = array[i];

}array[i] = pivot;

return i;

}// 前後遍曆法

private static int partition3(int array,int left,int right)

}swap(array,d - 1,left);

return d - 1;

}

7.歸併排序:

七大排序演算法之各演算法的比較

如果對七大排序演算法還不是很了解的,可以對著下面這些鏈結,再去學習或者熟悉下 氣泡排序 選擇排序 插入排序 快速排序 堆排序歸併排序 希爾排序 這篇文章主要是對這七大排序演算法做一些總結,什麼情況下應該用哪個排序演算法等。首先,再複習一下各個排序演算法的時間複雜度,以及穩定性 圖源自網路 先科普一下...

七大排序演算法

氣泡排序 void bubble int a,int n 選擇排序 void select sort int a,int n n為陣列a的元素個數 將第i 小的數,放在第i 個位置 如果剛好,就不用交換 if i min index 插入排序 typedef int elementtype void...

七大排序演算法

七大排序分類 插入排序 直接插入排序 穩定 希爾排序 不穩定 選擇排序 簡單選擇排序 穩定 堆排序 不穩定 交換排序 氣泡排序 穩定 快速排序 不穩定 歸併排序。直接插入排序 時間複雜度 o n 2 演算法穩定性 穩定void straightinsertsort int a,int n 氣泡排序 ...