冒泡排序(相邻比序法)
冒泡法
通过相邻记录进行交换,逐步将待排序序列变成有序序列的过程。
算法思想
第1趟:从第1个记录开始,扫描待排序记录序列,若相邻的两个记录逆序,则交换位置(消除一个逆序),最后第n个记录就是关键字最大的记录。
第2趟:同上述方法,对前n-1个元素冒泡排序,最后第n-1个记录就是次关键字最大的记录。
以此类推,直到第n-1趟完成后结束;或者在某一趟冒泡排序过程中没有发现一个逆序则可结束。
算法分析
最好情况:有序。比较次数n-1次,移动次数0次,时间复杂度为O(n)。
最坏情况:逆序。比较次数n(n-1)/2次,移动次数3n(n-1)/2次,时间复杂度为O(n2)。
注:交换一次移动3次。
空间复杂度:O(1)。
稳定性:稳定。
快速排序法
算法改进要点
冒泡法:交换相邻元素只能消除一个逆序。
快排法:交换不相邻元素,可以消除多个逆序。
基本思想
一趟快排:把待排序列分成左右两个子表,左表的关键字均小于右表的关键字。
重复,直至所有子表为单记录。
枢轴元素:左右子表的分界记录。
基准记录:枢轴元素应该放置在左右子表的最中间位置(基准位置),因此基准记录同枢轴元素。
一趟快排
枢轴元素的选取:第一个记录、最后一个记录、中间的记录、中间值的记录、随机记录。
算法分析
最好情况:每趟划分后的左右子表长度相等,时间复杂度为O(nlog2n),称之为平均性能最佳。
最坏情况:已经有序,总的比较次数n(n-1)/2,时间复杂度为O(n2)。
平均情况:Tavg(n)=klog2n,时间复杂度为O(nlog2n)。
空间复杂度:O(log2n)。
稳定性:不稳定。
欢迎大家加我微信交流讨论(请备注csdn上添加)