当前位置: 代码迷 >> 综合 >> 排序与查找算法
  详细解决方案

排序与查找算法

热度:54   发布时间:2024-01-20 02:02:20.0

一,排序

其中最基本的三种排序是冒泡,选择与插入。其平均复杂度为O(n^2). 但是其中选择排序在数据有序的情况or数据量小的情况下效率很高。虽然简单也是应该掌握的排序。

比如C++的STL库中的sort模板函数,在数据量较小的情况下使用的是插入排序,在数据量较大使用快速排序等。

1.冒泡

最简单的排序方法。思路如下 时间复杂度O(N^2) 空间复杂度O(1)

1)从左往右扫描两两比较数据,如果发现左边的数大于右边的数则交换。

第一轮扫描以后,最右边的数一定为序列中最大的数

2)第二轮开始扫描,重复步骤1,只是此次扫描排除第一轮中已经确定的最大数

3)以此类推知道最后一轮扫描仅剩下一个元素时排序结束

// Bubble sort
int bubble_sort(int *data, int length) {int i = 0, j = 0, temp;for(j = length - 1; j > 0; j--) {for(i = 0; i < j; i++) {if(data[i] > data[i + 1]) {temp = data[i + 1];data[i + 1] = data[i];data[i] = temp;}}}
}

2.选择排序

时间复杂度O(n^2), 空间复杂度O(1)

1)先将锚点选为第一个元素,然后逐一比较后续的每个数,如果发现有比锚点小的数则对其进行标记。

一轮扫描完以后将锚点标记的数与第一个元素进行交换;

2)接着将锚点标记为第二个数,并从第二个数起往后扫描,同样发现比锚点小的数则对齐进行重新标记。

一轮扫描完以后将锚点的数与第二个数进行交换;

3)以此类推直到只剩下最后一个数。

// Selection sort
int selection_sort(int *data, int length) {int i = 0, j = 0, k, temp;for(i = 0; i < length - 1; i++) {k = i;for(j = i + 1; j < length; j++) {if(data[k] > data[j])k = j;}// swap the dataif (k != i) {temp = data[k];data[k] = data[i];data[i] = temp;}}
}

3.插入排序

插入排序在数据量小or基本有序的情况下其效率非常之高。最理想的时间复杂度是O(n) ,也是STL中使用的一种排序算法。

插入排序的基本思想是:

1)从第二个元素开始与其前面对比,若发现逆序则交换。直到前面的数比其小则停止扫描

  相关解决方案