排序算法总结
比较类排序
交换排序
冒泡排序
冒泡排序:它重复地走访要排序的数列,依次比较两个元素,如果他们的顺序不满足升序(降序)要求就把它们交换回来。
算法描述(升序为例)
-
步骤一:比较相邻的元素。如果第一个比第二个大,就交换;
-
步骤二:对每一对相邻元素做同样的工作,从开始第一对到结尾最后一对,这样最后的元素应该是最大的数;
-
步骤三:将最后一个元素拿出,针对所有元素重复上述步骤;
代码
void bubbleSort(vector<int>& array) {
int len = array.size();
// 注意循环的终止条件
for (int i = 0; i < len - 1; ++i) {
for (int j = 0; j < len - 1 - i; ++j) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
快速排序
快速排序:通过一趟排序将待排记录分隔成独立的两个部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续排序,以达到整个序列有序。
算法描述
- 步骤一:从数列中挑出一个元素(一般为第一个),称为”基准“;
- 重新排序数组,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆放在基准的后面(相同的数可以放在任一边)。在这个分区推出之后,该基准就处于数列的中间位置。这个称为分区操作;
- 递归地把小于基准值元素的子数组和大于基准值元素的子数组排序。
代码
// 交换数组内两个元素
void swap(vector<int>& array, int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
int partition(vector<int>& array, int start, int end) {
int poivtElem = array[start];
int i = start;
for (int j = start + 1; j <= end; ++j) {
if (array[j] < poivtElem)
swap(array, ++i, j);
}
swap(array, i, start);
re