快速排序

快速排序算法

  一、基本思想:在待排序的 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)。

 

  四、思考

    快速排序是对冒泡排序的一种改进和优化,那么,你知道快排比冒泡到底好在哪儿吗?

 

 

 

 

 

    

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。