基础排序算法

选择排序

算法描述(从小到大)

首先找到数组中最小的元素,并将这个元素与数组的第1个元素交换位置。然后找数组中剩下的元素中最小的元素,再与数组的第2个元素交换位置。以此类推完成排序。

代码

vector<int> selection_sort(vector<int>& nums) {
	int n = nums.size();
	for (int i=0; i<n; i++) {
		int min_index = i;
		for (int j=i+1; j<n; j++) {
			if (nums[j]<nums[min_index]) {
				min_index=j;
			}
		}
		swap(nums[i], nums[min_index]);
	}
	return nums;
}

选择排序的特点

因为没有提前终止循环的可能性,即便输入已经排好序的数组,选择排序也将需要完整进行两次循环,也就是说,选择排序在所有情况下的时间复杂度都是O(n^2)级别。

插入排序

算法描述(从小到大)

扑克牌整理手牌的排序算法。遍历从第2张牌开始的每一张牌,然后把这张牌插入到前面合适的位置。

代码

void insertion_sort(int arr[], int n) {
	for (int i=1; i<n; i++) {
		int temp = arr[i];
		for (int j=i-1; j>=0; j--) {
			if (nums[j]>temp) {
				nums[j+1] = nums[j];
				nums[j] = temp;
			} else {
				break;
			}
		}
	}
}

插入排序的特点

插入排序针对近乎有序的数组有很高的性能,甚至在一些测试用例(比如完全有序)会快于O(nlogn)级别的排序算法,达到O(n)级别。


版权声明:本文为hanmingwang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。