標簽:頻繁 最大的 array -- 簡單 序列 兩個指針 算法 元素
簡單梳理一下以前學過的排序算法
平均時間復雜度:O(n2);穩定
public void bubbleSort(int[] array) {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length - 1; j++) {
if (array[j + 1] < array[j]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
平均時間復雜度:O(n2);不穩定
public void selectionSort(int[] array) {
for (int i = 0; i < array.length; i++) {
int minIndex = i;
for (int j = i; j < array.length; j++) {
if (array[j] < array[minIndex]) {
minIndex = j;
}
}
int temp = array[minIndex];
array[minIndex] = array[i];
array[i] = temp;
}
}
平均時間復雜度:O(n2);穩定
public void insertionSort(int[] array) {
int current;
for (int i = 0; i < array.length - 1; i++) {
current = array[i + 1];
int preIndex = i;
while (preIndex >= 0 && current < array[preIndex]){
array[preIndex + 1] = array[preIndex];
preIndex--;
}
array[preIndex + 1] = current;
}
}
平均時間復雜度:O(nlog?n);不穩定
希爾排序又叫做最小增量排序,將整個待排序的序列分割成為若干子序列,分別進行插入排序。
public void shellSort(int[] array){
int len = array.length;
int temp, gap = len / 2;
while (gap > 0) {
for (int i = gap; i < len; i++) {
temp = array[i];
int preIndex = i - gap;
while (preIndex >= 0 && array[preIndex] > temp) {
array[preIndex + gap] = array[preIndex];
preIndex -= gap;
}
array[preIndex + gap] = temp;
}
gap /= 2;
}
}
分治法的典型應用。始終都是 O(nlogn) 的時間復雜度,代價是需要額外的內存空間。
平均時間復雜度:O(nlogn);穩定
public void sort(int[] array) {
//在排序前,先建好一個長度等于原數組長度的臨時數組,避免遞歸中頻繁開辟空間
int[] temp = new int[array.length];
sort(array, 0, array.length - 1, temp);
}
public void sort(int[] array, int left, int right, int[] temp) {
if (left < right) {
int mid = (left + right) / 2;
sort(array, left, mid, temp); //左邊歸并排序,使得左子序列有序
sort(array, mid + 1, right, temp);//右邊歸并排序,使得右子序列有序
merge(array, left, mid, right, temp);//將兩個有序子數組合并操作
}
}
public void merge(int[] array, int left, int mid, int right, int[] temp){
int i = left; //左序列指針
int j = mid + 1; //右序列指針
int t = 0; //臨時數組指針
while (i <= mid && j <= right) {
if (array[i] <= array[j]) {
temp[t++] = array[i++];
} else {
temp[t++] = array[j++];
}
}
while (i <= mid) {//將左邊剩余元素填充進temp中
temp[t++] = array[i++];
}
while (j <= right) {//將右序列剩余元素填充進temp中
temp[t++] = array[j++];
}
t = 0;
//將temp中的元素全部拷貝到原數組中
while (left <= right) {
array[left++] = temp[t++];
}
}
平均時間復雜度:O(nlogn);不穩定
public void quickSort(int[] array, int left, int right) {
if (left < right) {
int index = getIndex(array, left, right);
quickSort(array, left, index - 1);
quickSort(array, index + 1, right);
}
}
public int getIndex(int[] array, int left, int right) {
int pivot = array[left];
while (left < right) {
while (left < right && array[right] >= pivot) {
right--;
}
array[left] = array[right];
while (left < right && array[left] <= pivot) {
left++;
}
array[right] = array[left];
}
array[right] = pivot;
return right;
}
public void quickSort(int[] array) {
quickSort(array, 0, array.length - 1);
}
有點遺忘,回頭補上
標簽:頻繁 最大的 array -- 簡單 序列 兩個指針 算法 元素
原文地址:https://www.cnblogs.com/leejk/p/15068383.html