快速排序
快速排序算法
一、基本思想:在待排序的 n 个记录中任取一个记录(通常取第一个记录),把该记录放入适当的位置后,数据序列被此记录划分为两部分,所有的关键字比该记录小的放在前部分、大的放置在后部分,并将该记录排在这两部分的中间,以此类推,直至所有的记录排序完成。
二、C 语言代码:
1 //对 R[s] 至 R[t] 的元素进行快速排序 2 void quickSort(RecType R[], int s, int t) 3 { 4 int i = s; 5 int j = t; 6 RecType tmp; 7 8 if (s < t) { 9 tmp = R[s]; //选定区间第一个元素作为基准 10 11 //从区间两端交替向中间扫描, 直至 i = j 为止 12 while (i != j) { 13 while (j > i && R[j].key > tmp.key) { //从右向左扫描 14 j--; 15 } 16 R[i] = R[j]; //将遍历寻找到的第一个 R[j].key 小于 tmp.key 的值进行交换 17 i++; 18 while (i < j && R[i].key < tmp.key) { 19 i++; 20 } 21 R[j] = R[i]; 22 j--; 23 } 24 R[i] = tmp; 25 quickSort(R, s, i-1); //对左区间递归排序 26 quickSort(R, i+1, t); //对右区间递归排序 27 } 28 }
三、算法分析
时间复杂度:由算法代码可知,快速排序是由两重循环组成,对于 n 个排序记录而言,外层必须经历 n-1 次循环,而内层循环采用迭代的方式,同时从左、右两个分区向中间遍历,故内层最少循环次数为 [log2n]/2,故对于快速排序而言:
关键字比较和记录移动的最少次数是 (n-1)[log2n]/2,算法的时间复杂度为 O(nlog2n)。
关键字比较和记录移动的最多次数为 (n-1)n/2,算法的时间复杂度为 O(n²)。
关键字平均比较和记录移动次数为 (n-1)[log2n]/2,算法的时间复杂度为 O(nlog2n)。
空间复杂度:由算法代码可知,当 s==t 时,快速排序才停止循环遍历记录,故所需的额外空间总共有 log2n 个 tmp 变量,故冒泡排序算法空间复杂度为 O(log2n)。
四、思考
快速排序是对冒泡排序的一种改进和优化,那么,你知道快排比冒泡到底好在哪儿吗?
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。