在数据结构中讲了一些基本的排序方法,在此做一个总结。
1 插入排序
这种排序是每一趟都在找某个带插入元素的位置,找到之后插入到待插入的点。
(1)直接插入排序
这种方法是从数组的第一个元素依次到最后一个元素,当当前为第i个元素时,和前面的元素逐个相比较,以找到其在前面i-1个元素当总的位置然后插入。
算法分析:这种排序算法在最好的情况(即排序前顺序)时,比较的次数为n-1,移动的次数为0;但是在逆序时,比较的次数为(n+2)(n+1)/2,元素移动的次数(n+4) (n-1)/2,因此其时间复杂度为O(N2)
(2)折半插入排序
为了克服直接插入元素在寻找插入位置时需要与已排好序的i-1个元素逐个比较,因此利用了折半查找的方法来确定其插入位置。这中方法相对于直接插入排序,只是 减少了其比较的次数,但是没有减少其移动的次数,因此其时间复杂度也为O(N2)
(3)2-路插入排序
(4)表插入排序
这种插入排序在插入过程当中不需要移动元素,当最后确定每个元素的最终位置时,在一次性移动元素,从而减少了前面排序过程当中大量移动元素的缺点。这种算法 只是在比较的过程当中以改变元素的指针来代替移动,但是并没有减少比较的次数,因此其时间复杂度也为O(N2)。
(5)希尔排序
2 快速排序
这种排序,每一趟完成之后,一个元素都能找到其最终排序的位置,并放在这个位置上。
(1)起泡排序
每一趟排序完成时,最大/最小的元素都会在未排序元素表的最始端/末端。这种排序算法最坏情况为的比较次数为n(n-2)/2,因此其时间复杂度为O(N2)。
(2)快速排序
快速排序每一趟完成时,一个元素都会找到其最终的位置并放入其中。其时间复杂度为O(nlogn)。
3 选择排序
这种排序每次都会选择到一个最大(或最小)的元素,然后将其依次放入数组中。
(1)简单选择排序
即每次都选择未排序的i——n个元素当中的最小元素。因此第i趟循环需进行的比较次数为n-i,因此其总的比较次数为n(n-1)/2,其时间负责度为O(N2)。
(2)堆排序
为了解决在简单排序过程当中每次比较的无记忆功能,堆排序的思想为首先建立一个大顶堆/小顶堆,这样在每次比较之后就不需要再一个一个去比较了,而只需要重新调整堆即可。其时间复杂度也为O(nlogn)