就是使一串記錄,按照其中的某個關鍵字的大小,遞增或遞減排列起來的操作。通常意義上的排序,指的是原地排序(公升序)。
穩定性:兩個相等的資料,如果經過排序後,排序演算法能保證其相對位置不發生變化,則稱該演算法是具備穩定性的排序。
例如: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 氣泡排序 ...