zoukankan      html  css  js  c++  java
  • 简析快速排序

    参考:百度百科-快速排序(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	", arr[i]);
     8     printf("
    ");
     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 }
  • 相关阅读:
    NSUserDefaults
    版本控制
    真机调试流程
    UIImageView加载图片的两种方式
    UI控件之--UIButton
    Xcode错误总结
    自动布局AutoLayout
    地理编码和反地理编码
    WordPress NOSpam PTI插件‘comment_post_ID’参数SQL注入漏洞
    WordPress RokMicroNews插件‘thumb.php’ 多个安全漏洞
  • 原文地址:https://www.cnblogs.com/cai1432452416/p/11053219.html
Copyright © 2011-2022 走看看