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