常见C++排序算法图

1,直接插入
插入排序的时间复杂度最好的情况是已经是正序的序列,只需比较(n-1)次,时间复杂度为O(n),最坏的情况是倒序的序列,要比较n(n-1)/2次,时间复杂度为O(n^2 ) ,平均的话要比较时间复杂度为O(n^2 )
插入排序是一种稳定的排序方法,排序元素比较少的时候很好,大量元素便会效率低下
1 | void InsertSort2(vector<int> &num) |

2,希尔排序
希尔排序(ShellSort )是插入排序的一种,是对直接插入排序算法的 改进该方法又称为缩小增量
排序。比较相距一定间隔的元素,即形如L[i,i+d,i+2d,…,i+kd]的序列然后缩小间距,再对各分组序列进行排序。直到之比较相邻元素的最后一趟排序为止,即最后的间距为1。
1 | void ShellSort(vector<int> & nums){ |

3,直接选择
对要排序的序列,选出关键字最小的数据,将它和第一个位置的数据交换,接着,选出关键字次小的 数据,将它与第二个位置上的数据交换。以此类推,直到完成整个过程 ,所以如果有n个数据,那么则需要遍历n-1遍。
1 | void SelectSort(vector<int> &nums){ |
4,堆排序
将数组A创建为一个最大堆,然后交换堆的根(最大元素)和最后一个叶节点x,将x从堆中去掉形成新的堆A1,然后重复以上动作,直到堆中只有一个节点。
堆排序的时间复杂度是O(nlgN),与快速排序达到相同的时间复杂度。但是在实际应用中,我们往往采用快速排序而不是堆排序。这是因为快速排序的一个好的实现,往往比堆排序具有更好的表现。堆排序的主要用途,是在形成和处理优先级队列方面。另外,如果计算要求是类优先级队列(比如,只要返回最大或者最小元素,只有有限的插入要求等),堆同样是很适合的数据结构。
1 | //堆排序 |

5,冒泡排序
比较相邻的元素,如果反序则交换,过程也是分为有序区和无序区,初始时有序区为空,所有元素都在无序区,经过第一趟后就能找出最大的元素,然后重复便可
1 | void BubbleSort(int arr[], int n) |
6,快速排序
快速排序首先选一个轴值(pivot,也有叫基准的),将待排序记录划分成独立的两部分,左侧的元素均小于轴值,右侧的元素均大于或等于轴值,然后对这两部分再重复,直到整个序列有序
过程是和二叉搜索树相似,就是一个递归的过程
1 | QuickSort(int arr[], int first, int end){ |

7,归并排序
1 | void Merge(int arr[], int reg[], int start, int end) { |

8,基数排序
它是一种非比较排序。它是根据位的高低进行排序,也就是先按照个位排序然后按照十位
排序……依次类推
1 | /*基数排序*/ |
