Java版和C++版實現快速排序和合並排序

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);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章