简介:总的来说,排序算法共有八大类,即冒泡排序、选择排序、快速排序、插入排序、希尔排序、归并排序、基数排序以及堆排序等,本文另外也介绍了桶排序。编程语言使用了C/C++(其实主要用的C),3个经常出现的函数形参,arr - 待排序数组名(首元素地址)、bgn - 待排序数组起始排序元素位置(有时我们仅需要对数组中某一段元素进行排序,但通常bgn = 0,即arr首元素位置)、end - 待排序数组截止排序尾元素的下一个位置(即该位置无效,不可引用)。文中均已升序为例,降序原理相同。
时间复杂度:描述该算法在处理大量数据时,总的来说其时间效率的参考; 稳定性:描述算法对原始序列处理前后,该序列相等大小的元素前后位置是否发生改变
两个常用的函数:1、获取数组最大元素值; 2、交换两个整形元素。代码如下:
//获取整形数组的最大值 //NOTE: 默认arr非空 int getMaxValue(const vector<int> &arr) { int max = INT_MIN; for (auto val : arr) { if (val > max) max = val; } return max; } /*交换两个整形值*/ void mySwap(int *pa, int *pb) { int tmp = *pa; *pa = *pb; *pb = tmp; }
1、冒泡排序 - 依次比较相邻两元素,若前一元素大于后一元素则交换之,直至最后一个元素即为最大;然后重新从首元素开始重复同样的操作,直至倒数第二个元素即为次大元素;依次类推。如同水中的气泡,依次将最大或最小元素气泡浮出水面。
时间复杂度:O(N2) 稳定性:稳定
/*冒泡排序*/ void bubbleSort(vector<int> &arr, int bgn, int end) { /*isLoop用于指示依次遍历中是否发生元素交换,若没有,则已是有序数列,退出即可*/ bool isLoop = true; for (int i = end; true == isLoop && i > bgn; --i) { isLoop = false; for (int j = bgn + 1; j < i; ++j) { if (arr[j] < arr[j - 1]) { mySwap(&arr[j], &arr[j - 1]); isLoop = true; } } } }