1. 快排
快排選擇的思想是選擇一個基值,基值左邊的數比基值小,基值後邊的數比基值大。
C++實現
#include <iostream>
#include <vector>
using namespace std;
int partition(vector<int> &vec, int low, int high) {
int pivot = vec[low];
int i = low, j = high;
while (i < j) {
while(i < j && vec[j] >= pivot)
--j;
if (i < j)
vec[i++] = vec[j];
while(i < j && vec[i] <= pivot)
++i;
if (i < j)
vec[j--] = vec[i];
}
vec[i] = pivot;
return i;
}
void quickSort(vector<int> &vec, int low, int high) {
if (low < high) {
int mid = partition(vec, low, high);
quickSort(vec, low, mid - 1);
quickSort(vec, mid + 1, high);
}
}
void qSort(vector<int> &vec) {
quickSort(vec, 0, vec.size() - 1);
}
int main() {
vector<int> t = {3,1,2,4,8,7,5,6,2,5,6,2,6,78,5,2,6,8,4,2,23,5,7,2,1,4,2,1};
qSort(t);
for (int i = 0; i < t.size(); ++i) {
cout << t[i] << " ";
}
return 0;
}
Java實現
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] A = {12,3,4,2,1,3,4,2,12,3,4,12,3,124,1,45,12,31,4,12,31,4,12,3,14,5,6,24,7,437,34,57};
QuickSort.quickSort(A, 0, A.length - 1);
System.out.println(Arrays.toString(A));
}
public static int partition(int[] A, int low, int high) {
int pivot = A[low];
int i = low, j = high;
while (i < j) {
while (i < j && A[j] >= pivot)
--j;
if (i < j)
A[i++] = A[j];
while (i < j && A[i] <= pivot)
++i;
if (i < j)
A[j--] = A[i];
}
A[i] = pivot;
return i;
}
public static void quickSort(int[] A,int low, int high) {
if (low >= high)
return;
int mid = partition(A, low, high);
quickSort(A, low, mid - 1);
quickSort(A, mid + 1, high);
}
}
2. 合併排序
合併排序採用分治的思想,先部分排序,然後合併部分排序後的數組
C++實現
#include <iostream>
#include <vector>
using namespace std;
void Merge(vector<int> &a, int low, int mid, int high) {
vector<int> temp(high - low + 1, 0);
int i = low, j = mid + 1, k = 0;
while (i <= mid && j <= high) {
if (a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while (i <= mid)
temp[k++] = a[i++];
while (j <= high)
temp[k++] = a[j++];
for (i = 0; i < temp.size(); ++i)
a[low + i] = temp[i];
}
void MergeSort(vector<int> &a, int low, int high) {
if (low >= high)
return;
int mid = (low + high) >> 1;
MergeSort(a, low, mid);
MergeSort(a, mid + 1, high);
Merge(a, low, mid, high);
}
int main() {
vector<int> a = {12,3,4,2,1,3,4,2,12,3,4,12,3,124,1,45,12,31,4,12,31,4,12,3,14,5,6,24,7,437,34,57};
MergeSort(a, 0, a.size() - 1);
return 0;
}
Java實現
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] A = {12,3,4,2,1,3,4,2,12,3,4,12,3,124,1,45,12,31,4,12,31,4,12,3,14,5,6,24,7,437,34,57};
MergeSort.mergeSort(A, 0, A.length - 1);
System.out.println(Arrays.toString(A));
}
public static void merge(int[] A, int low, int mid, int high) {
int[] temp = new int[high - low + 1];
int i = low, j = mid + 1, k = 0;
while (i <= mid && j <= high) {
if (A[i] <= A[j])
temp[k++] = A[i++];
else
temp[k++] = A[j++];
}
while (i <= mid)
temp[k++] = A[i++];
while (j <= high)
temp[k++] = A[j++];
for (i = 0; i < temp.length; ++i)
A[low + i] = temp[i];
}
public static void mergeSort(int[] A, int low, int high) {
if (low >= high)
return;
int mid = (low + high) >> 1;
mergeSort(A, low, mid);
mergeSort(A, mid + 1, high);
merge(A, low, mid, high);
}
}