各类排序算法的C++实现

本文使用C++实现了各种常见的排序算法,供读者参考。

排序算法一览:

1、直接插入排序
2、希尔排序
3、冒泡排序
4、快速排序
5、直接选择排序
6、归并排序

以下是代码实现:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

// 1、直接插入排序:从无序区间选择一个值,放到有序区间的合适位置
void insertSort(vector<int>& arr) {
    
    
	int i, j, temp, len = arr.size();
	for (i = 1; i < len; ++i) {
    
    
		temp = arr[i];
		for (j = i - 1; j >= 0 && temp < arr[j]; --j) {
    
    
			arr[j + 1] = arr[j];	// 向后移动
		}
		arr[j + 1] = temp;
	}
}

// 2、希尔排序:增量 + 插入
void shellSort(vector<int>& arr) {
    
    
	int h, i, j, temp, len = arr.size();
	for (h = len / 2; h > 0; h /= 2) {
    
    
		for (i = h; i < len; ++i) {
    
    
			temp = arr[i];
			for (j = i - h; j >= 0 && temp < arr[j]; j -= h) {
    
    
				arr[j + h] = arr[j];
			}
			arr[j + h] = temp;
		}
	}
}

// 3、冒泡排序:遇到小的值就进行交换,直到交换出无序队列的最小值
void bubbleSort(vector<int>& arr) {
    
    
	int len = arr.size();
	for (int i = 0; i < len; ++i) {
    
    
		bool change = false;
		for (int j = len - 2; j >= i; --j) {
    
    
			if (arr[j] > arr[j + 1]) {
    
    
				swap(arr[j], arr[j + 1]);
				change = true;
			}
		}
		if (!change) return;
	}
}

// 4、快速排序
void quickSort(vector<int>& arr, int low, int high) {
    
    
	int i, j, pivot;
	if (low < high) {
    
    
		i = low;
		j = high;
		pivot = arr[low];
		while (i < j) {
    
    	// 分解:以pivot为中点,将区间分为大于pivot的和小于pivot的
			while (i < j && arr[j] >= pivot) --j;
			if (i < j) arr[i++] = arr[j];
			while (i < j && arr[i] <= pivot) ++i;
			if (i < j) arr[j--] = arr[i];
		}
		arr[i] = pivot;
		quickSort(arr, low, i - 1);		// 递归左子区间
		quickSort(arr, i + 1, high);	// 递归右子区间
	}
}

// 5、直接选择排序
void selectSort(vector<int>& arr) {
    
    
	int pos, len = arr.size();
	for (int i = 0; i < len; ++i) {
    
    
		pos = i;
		for (int j = i + 1; j < len; ++j) {
    
      // 选择无序区中的最小值
			if (arr[j] < arr[pos]) {
    
    
				pos = j;
			}
		}
		swap(arr[pos], arr[i]);
	}
}

// 6、堆排序 


// 7、归并排序

// 对有序区间的合并
void merge(vector<int>& arr, int left, int mid, int right) {
    
    
	vector<int> tmp(right + 1, 0);
	int i = left, j = mid + 1, pos = left;
	while (i <= mid && j <= right) {
    
    
		if (arr[i] <= arr[j]) {
    
    
			tmp[pos++] = arr[i++];
		} else {
    
    
			tmp[pos++] = arr[j++];
		}
	}
	while (i <= mid) tmp[pos++] = arr[i++];
	while (j <= right) tmp[pos++] = arr[j++];
	for (int i = left; i <= right; ++i) {
    
    
		arr[i] = tmp[i];
	}
}

// 归并排序:不断分解子数组,然后合并
void mergeSort(vector<int>& arr, int left, int right) {
    
    
	if (left >= right) return;
	int mid = left + ((right - left) >> 2);
	mergeSort(arr, left, mid);
	mergeSort(arr, mid + 1, right);
	merge(arr, left, mid, right);	
}

int main() {
    
    

	// 1、直接插入排序
	vector<int> arr{
    
     4,5,6,1,6,42,2,31,4,5,7,8,9,0,64,4,23 };
	insertSort(arr);
	cout << "insertSort: ";
	for (auto& iter : arr) {
    
     cout << iter << " "; }
	cout << endl;
	
	// 2、希尔排序
	vector<int> arr2{
    
     4,5,6,1,6,42,2,31,4,5,7,8,9,0,64,4,23 };
	shellSort(arr2);
	cout << "shellSort:  ";
	for (auto& iter : arr2) {
    
     cout << iter << " "; }
	cout << endl;

	// 3、冒泡排序
	vector<int> arr3{
    
     4,5,6,1,6,42,2,31,4,5,7,8,9,0,64,4,23 };
	bubbleSort(arr3);
	cout << "bubbleSort: ";
	for (auto& iter : arr3) {
    
     cout << iter << " "; }
	cout << endl;

	// 4、快速排序
	vector<int> arr4{
    
     4,5,6,1,6,42,2,31,4,5,7,8,9,0,64,4,23 };
	quickSort(arr4, 0, arr4.size() - 1);
	cout << "quickSort:  ";
	for (auto& iter : arr4) {
    
     cout << iter << " "; }
	cout << endl;

	// 5、直接选择排序
	vector<int> arr5{
    
     4,5,6,1,6,42,2,31,4,5,7,8,9,0,64,4,23 };
	selectSort(arr5);
	cout << "selectSort: ";
	for (auto& iter : arr5) {
    
     cout << iter << " "; }
	cout << endl;

	// 6、归并排序
	vector<int> arr7{
    
     4,5,6,1,6,42,2,31,4,5,7,8,9,0,64,4,23 };
	mergeSort(arr7, 0, arr7.size() - 1);
	cout << "mergeSort:  ";
	for (auto& iter : arr7) {
    
     cout << iter << " "; }
	cout << endl;

	return 0;
}

以下是程序输出:

insertSort: 0 1 2 4 4 4 5 5 6 6 7 8 9 23 31 42 64
shellSort:  0 1 2 4 4 4 5 5 6 6 7 8 9 23 31 42 64
bubbleSort: 0 1 2 4 4 4 5 5 6 6 7 8 9 23 31 42 64
quickSort:  0 1 2 4 4 4 5 5 6 6 7 8 9 23 31 42 64
selectSort: 0 1 2 4 4 4 5 5 6 6 7 8 9 23 31 42 64
mergeSort:  0 1 2 4 4 4 5 5 6 6 7 8 9 23 31 42 64

谢谢阅读

猜你喜欢

转载自blog.csdn.net/weixin_43869898/article/details/111565154