首页 > 编程语言 > 详细

简析快速排序

时间:2019-06-19 19:59:49      阅读:106      评论:0      收藏:0      [点我收藏+]
参考:百度百科-快速排序(Quicksort)

算法原理:(冒泡排序的改进版)

说明:设要排序的数组是A[0]...A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,
然后将所有 比它小的数都放到它左边,所有比它大的数都放在它右边,这个过程称为一趟快速排序。
算法:
1. 设置两个变量i,j,排序开始的时候i = 0, j = N-1;
2. 以第一个数组元素作为关键数据,赋值给key, 即key = A[0];
3. 从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]的值交换。
4. 从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]的值交换。
5. 重复3,4步,直到i == j;
备注:
3,4步中,没找到符合条件的值,即3中A[j]不小于key, 4中A[i]不大于key的时候改变j,i的值,
使得j = j-1,i = i+1,直到找到位置。找到符合条件的值,进行交换的时候i, j指针位置不变。
另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束。
 
Tips: 每次值交换的时候就是与key = A[0]做交换。即分割作用。

排序示例图:

技术分享图片

算法分析:

时间复杂度:O(n2)
不稳定排序算法:根据比较基数值判断是否交换,且不是相邻元素来交换,在交换过程中可能改变相同元素的顺序
算法复杂度:O(n log n)

算法实现:

1. C语言版本:
 1 #include "stdlib.h"
 2 #include <stdio.h>
 3 
 4 //打印数组元素
 5 void printSelect(int arr[], int len){
 6     for (int i = 0; i<len; i++)
 7         printf("%d\t", arr[i]);
 8     printf("\n");
 9 }
10 
11 //快排
12 void quickSort(int arr[], int left, int right) {
13     int i = left, j = right;
14     int tmp = 0, key = 0;
15     if (left > right)
16         return;
17     key = arr[left]; //temp中存的就是基准数
18     while (i != j) { 
19         //先从右边开始找
20         while (arr[j] >= key && i < j) j--;
21         //再找右边的
22         while (arr[i] <= key && i < j) i++;
23         //交换两个数在数组中的位置
24         if (i < j){
25             tmp = arr[i];
26             arr[i] = arr[j];
27             arr[j] = tmp;
28         }
29     }
30     //最终将基准数归位
31     arr[left] = arr[i];
32     arr[i] = key;
33     //继续处理左边的,这里是一个递归的过程
34     quickSort(arr, left, i - 1);
35     //继续处理右边的 ,这里是一个递归的过程
36     quickSort(arr, i + 1, right);
37 }
38 
39 //c语言qsort比较函数
40 int qsortCompare(const void *a, const void *b){
41     return *(int *)a - *(int *)b;;
42 }
43 
44 int main() {
45     int arr[] = { 3, 5, 1, -7, 4, 9, -16, 8, 10, 4, -8 };
46     int arrLen = sizeof(arr) / sizeof(arr[0]);
47     //快速排序调用
48     quickSort(arr, 0, arrLen - 1);
49     //输出排序后的结果
50     printSelect(arr, arrLen);
51     
52     //库函数
53     int arrQSort[] = { 3, 5, 1, -7, 4, 9, -16, 8, 10, 4, -8 };
54     arrLen = sizeof(arrQSort) / sizeof(arrQSort[0]);
55     qsort(arrQSort, arrLen, sizeof(arrQSort[0]), qsortCompare);
56     printSelect(arrQSort, arrLen);
57 
58     system("pause");
59     return 0;
60 }

2. C++版本:

 1 #include "cstdlib"
 2 #include "iostream"
 3 #include <cstdio>
 4 
 5 using namespace std;
 6 //打印数组元素
 7 template<typename T> void printSelect(T arr[], int len){
 8     for (int i = 0; i<len; i++)
 9         cout << arr[i] <<  ;
10     cout << endl;
11 }
12 
13 //快排
14 template<typename T>void quickSort(T arr[], int left, int right) {
15     int i = left, j = right;
16     T tmp = 0, key = 0;
17     if (left > right)
18         return;
19     key = arr[left]; //temp中存的就是基准数
20     while (i != j) { 
21         //先从右边开始找
22         while (arr[j] >= key && i < j) j--;
23         //再找右边的
24         while (arr[i] <= key && i < j) i++;
25         //交换两个数在数组中的位置
26         if (i < j){
27             tmp = arr[i];
28             arr[i] = arr[j];
29             arr[j] = tmp;
30         }
31     }
32     //最终将基准数归位
33     arr[left] = arr[i];
34     arr[i] = key;
35     //继续处理左边的,这里是一个递归的过程
36     quickSort(arr, left, i - 1);
37     //继续处理右边的 ,这里是一个递归的过程
38     quickSort(arr, i + 1, right);
39 }
40 
41 
42 //借助c语言qsort
43 //c语言qsort比较函数
44 int qsortCompare(const void *a, const void *b){
45     return *(int *)a - *(int *)b;
46 }
47 
48 int main() {
49     double arr[] = { 3, 5, 1, -7, 4, 9.45, -16, 8, 10, 4, -8 };
50     int arrLen = sizeof(arr) / sizeof(arr[0]);
51     //快速排序调用
52     quickSort(arr, 0, arrLen - 1);
53     //输出排序后的结果
54     printSelect(arr, arrLen);
55 
56     //库函数
57     int arrQSort[] = { 3, 5, 1, -7, 4, 9, -16, 8, 10, 6, -8 };
58     arrLen = sizeof(arrQSort) / sizeof(arrQSort[0]);
59     qsort(arrQSort, arrLen, sizeof(arrQSort[0]), qsortCompare);
60     printSelect(arrQSort, arrLen);
61 
62     system("pause");
63     return 0;
64 }

 

简析快速排序

原文:https://www.cnblogs.com/cai1432452416/p/11053219.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!