常见排序算法

#include <iostream>
using namespace std;

// 打印数组
void printArray(int A[], int N)
{
	for (int i = 0; i < N; i++) {
		cout << A[i] << " ";
	}
}

// 冒泡排序
void bubleSort(int A[], int N)
{
	bool swapped;
	for (int i = 0; i < N - 1; i++) {
		swapped = false;
		for (int j = 0; j < N - i - 1; j++) {
			if (A[j] > A[j + 1]) {
				swap(A[j], A[j + 1]);
				swapped = true;
			}
		}
		if (!swapped) {
			break;
		}
	}
}

// 插入排序
void insertSort(int A[], int N)
{
	for (int i = 1; i < N; i++) {
		int val = A[i];
		int j = i - 1;
		for (; j >= 0 && A[j] > val; j--) {
			A[j + 1] = A[j];
		}
		A[j + 1] = val;
	}
}

// 选择排序
void selectionSort(int A[], int N)
{
	for (int i = 0; i < N - 1; i++) {
		int min = i;
		for (int j = i + 1; j < N; j++) {
			if (A[j] < A[min]) {
				min = j;
			}
		}
		swap(A[i], A[min]);
	}
}

// 希尔排序
void shellSort(int A[], int N)
{
	for (int increment = N / 2; increment > 0; increment /= 2) {
		// 对每个子数组执行插入排序
		for (int i = increment; i < N; i++) {
			int tmp = A[i];
			int j;
			for (j = i; j >= increment && A[j - increment] > tmp; j -= increment) {
				A[j] = A[j - increment];
			}
			A[j] = tmp;
		}
	}
}

// 下沉操作,用于维护堆的性质
void heapify(int arr[], int n, int i)
{
	int largest = i; // 根节点
	int left = 2 * i + 1;
	int right = 2 * i + 2;

	if (left < n && arr[left] > arr[largest]) {
		largest = left;
	}

	if (right < n && arr[right] > arr[largest]) {
		largest = right;
	}

	if (largest != i) {
		swap(arr[i], arr[largest]);
		heapify(arr, n, largest);
	}
}

// 堆排序
void heapSort(int A[], int N)
{
	// 构建堆,大顶堆
	for (int i = N / 2 - 1; i >= 0; i--) {
		heapify(A, N, i);
	}

	// 逐一从堆中取出最大值,将其放入已排序部分,再调整堆
	for (int i = N - 1; i > 0; i--) {
		swap(A[0], A[i]);
		heapify(A, i, 0); // 调整堆
	}
}

// 将数组分为小于基准和大于基准的两部分,返回基准的索引位置
int partion(int arr[], int left, int right)
{
	int pivot = arr[right]; // 选择最后一个元素作为基准
	int i = left;
	int j = right - 1;

	for (;; i++, j--) {
		while (i <= right && arr[i] < pivot) { i++; }
		while (j >= left && arr[j] > pivot) { j--; }
		if (i < j) {
			swap(arr[i], arr[j]);
		} else {
			break;
		}
	}

	swap(arr[i], arr[right]);

	return i;
}

// 快速排序
void quickSort(int A[], int left, int right)
{
	if (left < right) {
		// 找到基准索引的位置
		int pivot = partion(A, left, right);

		// 递归地对左右子数组执行快速排序
		quickSort(A, left, pivot - 1);
		quickSort(A, pivot + 1, right);
	}
}

// 合并两个子数组
void merge(int arr[], int tmpArr[], int left, int right, int rightEnd)
{
	int leftEnd = right - 1;
	int tmp = left;
	int num = rightEnd - left + 1;

	while (left <= leftEnd && right <= rightEnd) {
		if (arr[left] < arr[right]) {
			tmpArr[tmp++] = arr[left++];
		} else {
			tmpArr[tmp++] = arr[right++];
		}
	}

	while (left <= leftEnd) {
		tmpArr[tmp++] = arr[left++];
	}
	while (right <= rightEnd) {
		tmpArr[tmp++] = arr[right++];
	}

	for (int i = 0; i < num; i++, rightEnd--) {
		arr[rightEnd] = tmpArr[rightEnd];
	}
}

void msort(int A[], int tmpArr[], int left, int right)
{
	if (left < right) {
		int middle = left + (right - left) / 2;

		// 递归地对左右两部分进行排序
		msort(A, tmpArr, left, middle);
		msort(A, tmpArr, middle + 1, right);

		// 合并已排序地两部分
		merge(A, tmpArr, left, middle + 1, right);
	}
}

// 归并排序
void mergeSort(int A[], int N)
{
	int* tmpArr = new int[N];
	msort(A, tmpArr, 0, N - 1);
	delete[] tmpArr;
}

int main()
{
	int A[10]{ 22,1,4,18,6,51,9,7,10,3 };

	printArray(A, 10);
	cout << endl;

	//insertSort(A, 10);
	//bubleSort(A, 10);
	//selectionSort(A, 10);
	//shellSort(A, 10);
	//heapSort(A, 10);
	//quickSort(A, 0, 9);
	mergeSort(A, 10);

	printArray(A, 10);
	cout << endl;

	return 0;
}

  

posted @ 2019-03-18 20:44  jackii  阅读(125)  评论(0编辑  收藏  举报