简析快速排序

参考:百度百科-快速排序(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 }

 

posted @ 2019-06-19 18:42  Jova  阅读(290)  评论(0编辑  收藏  举报