C++常用排序算法

冒泡排序

算法描述:

冒泡排序要对一个数组多次重复遍历。它要比较相邻的两项,并且交换顺序排错的项。每对数组进行一次遍历,就会有一个最大项排在了正确的位置。大体上讲,数组的每一个数据项都会在其相应的位置“冒泡”。若数组有n项,则需要遍历n-1次。

时间复杂度: \(O(n^2)\)

点击查看代码
void bubbleSort(vector<int>& v) {
	int n = v.size();
	for (int i = 0; i < n - 1; i++) {
		for (int j = 0; j < n - i - 1; j++) {
			if (v[j] > v[j + 1]) {
				swap(v[j], v[j + 1]);
			}
		}
	}
}

选择排序

算法描述

选择排序提高了冒泡排序的性能,它每一次遍历一次数组只会进行一次交换,即在遍历过程中记录最大项的索引,完成遍历后,再把它换到正确的位置,同样若数组有n项,它也需要遍历n-1次。

时间复杂度:\(O(n^2)\)

点击查看代码
void selectSort(vector<int>& v){
	int n = v.size();
	for(int i=0;i<n-1;i++){
		int index = 0;
		for(int j=1;j<n-i;j++){
			if(v[j] > v[index]){
				index = j;
			}
		}
		swap(v[index], v[n-1-i]);
	}
}

插入排序

算法描述

插入排序总是保持一个位置靠前的已经排好的数组,然后每一个新的数据项被“插入”到前边的子表里。共需进行n-1次插入,每进行一次插入,排好的数组增加一项。

时间复杂度:\(O(n^2)\)

点击查看代码
void insertSort(vector<int>& v){
	int n = v.size();
	for(int i=1;i<n;i++){
		for(int j=i;j>0;j--){
			if(v[j] < v[j-1]){
				swap(v[j], v[j-1]);
			}
			else{
				break;
			}
		}
	}
}

归并排序

算法描述

归并排序是一种递归算法,持续地将一个数组分成两半。如果数组是空的或者只有一个元素,那么根据定义,它就被排序好了。如果数组里的元素超过一个,我们就把数组拆分,然后分别对两个部分调用递归排序,一旦这两个部分被排序好了,就对这两个部分进行归并。

时间复杂度: \(O(nlogn)\)

点击查看代码
void merge(vector<int>& v, int left, int mid, int right){
	vector<int> temp = v;
	int i = left, j = mid + 1;
	int index = left;
	while(i <= mid || j <= right){
		if(i > mid){
			v[index++] = temp[j];
			j++;
		}
		else if(j > right){
			v[index++] = temp[i];
			i++;
		}
		else if(temp[i] < temp[j]){
			v[index++] = temp[i];
			i++;
		}
		else{
			v[index++] = temp[j];
			j++;
		}
	}
	
}
void merge_Sort(vector<int>& v, int left, int right){
	if(left >= right) return;
	int mid = (left + right) / 2;
	merge_Sort(v, left, mid);
	merge_Sort(v, mid + 1, right);
	if(v[mid] > v[mid + 1]){
		merge(v, left, mid, right);
	}
}
void mergeSort(vector<int>& v){
	int n = v.size();
	merge_Sort(v, 0, n - 1);
}

快速排序

算法描述

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分小,然后对两部分进行递归的快速排序。

时间复杂度: \(O(nlogn)\)

算法步骤

  1. 从数组中挑出一个元素,称为“基准”(pivot);
  2. 重新排序数组,所有比基准小的数放在基准前面,所有比基准大的元素放在基准后面,这称为分区(partition)操作;
  3. 递归地对基准两边的子数组进行排序。
点击查看代码
void quick_Sort(vector<int>& v, int left, int right){
	if(left >= right) return;
	int i = left, j = right, base = v[left];  //取最左边的数为基数
	while(i < j){
		while(v[j] >= base && i < j){
			j--;
		}
		while(v[i] <= base && i < j){
			i++;
		}
		if(i < j){
			swap(v[i], v[j]);
		}
	} 
	v[left] = v[i];
	v[i] = base;
	quick_Sort(v, left, i - 1);
	quick_Sort(v, i + 1, right);
}
void quickSort(vector<int>& v){
	int n = v.size();
	quick_Sort(v, 0, n - 1);
}

常见排序算法总结Python实现

posted @ 2021-10-16 16:29  卿源  阅读(191)  评论(0)    收藏  举报