算法基础:排序算法总结以及c++实现源码分享(附上测试用例)

991 阅读1分钟

排序算法是算法的基础,扎实掌握是一个合格程序员的内功,所以小编今天抽时间把排序算法总结一把,方便自己复习以及知识的分享。

一. 选择排序

1.算法思想

从头至尾扫描序列,找出最小的一个元素,和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列。

2.c++代码实现

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

template<typename T>
void selectionSort(vector<T> & arr) {
	for (int i = 0; i < arr.size(); ++i) {
		int minIndex = i;
		for (int j = i + 1; j < arr.size(); ++j) {
			if (arr[j] < arr[minIndex])
				minIndex = j;
		}
		swap(arr[i], arr[minIndex]);
	}
}

int main() {
	vector<int> arr{ 4,7,8,3,6,45 };
	selectionSort(arr);
	for (auto it = arr.begin(); it!= arr.end(); it++) {
		cout << *it << " ";
	}
	system("pause");
	return 0;
}                                          

时间复杂度:O(N^2)

空间复杂度:O(1)

二. 插入排序

1.算法思想

插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序。

2.c++代码实现

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
template<typename T> void insertSort(std::vector<T> & arr) {
	for (int i = 1; i < arr.size(); ++i) {
		for (int j = i; j > 0; --j) {
			if (arr[j] < arr[j - 1])
				std::swap(arr[j], arr[j - 1]);
			else
				break;
		}
	}
}

int main() {
	vector<int> arr{ 4,7,8,3,6,45 };
	selectionSort(arr);
	for (auto it = arr.begin(); it != arr.end(); it++) {
		cout << *it << " ";
	}
}

时间复杂度O(N^2)

空间复杂度:O(1)

应用场景:数组中大部分数据都是有序的。(排序日志)

三.快速排序

1.算法思想

该方法的基本思想是:

  • 1.先从数列中取出一个数作为基准数。
  • 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
  • 3.再对左右区间重复第二步,直到各区间只有一个数。  

2.c++代码实现

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

template<typename T> int partition(std::vector<T>& arr, int l, int r) {
	T v = arr[l];
	int j = l;
	for (int i = l + 1; i <= r; ++i) {
		if (arr[i] < v) {
			std::swap(arr[j + 1], arr[i]);
			++j;
		}
	}
	std::swap(arr[l], arr[j]);
	return j;
}

template<typename T> void quickSort(std::vector<T>& arr,int l,int r) {
	if (l >= r)
		return;
	int p = partition(arr, l, r);
	quickSort(arr, l, p - 1);
	quickSort(arr, p + 1, r);

}

template<typename T> void quickSort(std::vector<T>& arr) {
	quickSort(arr, 0, arr.size() - 1);
}
int main() {
	vector<int> arr{ 4,7,8,3,6,45 };
	quickSort(arr);
	for (auto it = arr.begin(); it != arr.end(); it++) {
		cout << *it << " ";
	}
}