• 分治法? 递归? 快速排序 C语言


     快速排序,说白了就是给基准数据找其正确索引位置的过程.

    快速排序主要 是要找准中心基点,直到最大最小点比较最小点大于最大点结束,左右分别开始比较,第一轮比较完毕后,左边基本都是比中心基点小的,右边都是比中心基点大的,两边同时进行递归继续同样操作;

     

     

     写法一:

     1 static void fast() {
     2     printf("
    "); printf("快速排序请输入:"); printf("
    ");
     3     static void ks(int arr[], int left, int right);
     4     int arr[10];
     5     for (int i = 0; i < 10; i++)scanf("%d", &arr[i]);
     6     int len = sizeof(arr) / sizeof(arr[0]);//长度
     7     //printf("%d", len);
     8     ks(arr, 0, len - 1);
     9     //打印
    10     for (int i = 0; i < len; i++)printf("%d ", arr[i]); printf("
    ");
    11 }
    12 
    13 //快速 排序
    14 static void ks(int arr[], int left, int right) {
    15     int i = left;    //最左边的下标
    16     int j = right; //最右边的下标
    17     int temp;//互换元素
    18     int pivot = arr[(left + right) / 2];//中间起点  基准点
    19     while (i<=j)
    20     {
    21         //从左往右找到大于基准点的元素
    22         while (arr[i]<pivot)
    23         {
    24             i++;
    25         }
    26         //从右往左找到小于于基准点的元素
    27         while (arr[j] > pivot)
    28         {
    29             j--;
    30         }
    31         //i<=j  进行互换
    32         if (i<=j)
    33         {
    34             temp = arr[i];
    35             arr[i] = arr[j];
    36             arr[j] = temp;
    37             i++;
    38             j--;
    39         }
    40     }
    41     //递归操作
    42     if (left<j)
    43     {
    44         ks(arr,  left, j);
    45     }
    46     if (i < right)
    47     {
    48         ks(arr,i, right);
    49     }
    50 
    51 }

    写法二:  c语言

     1 #include<stdio.h>
     2 int a[6];
     3 int main() {
     4     printf("开始快速排序请输出 5个数: ");
     5     //快速排序
     6     for (int i = 0; i < 5; i++) {
     7         scanf_s("%d", &a[i]);
     8     }
     9     qsort(0, 4);//4=n-1  n是数组长度
    10     //降序排列
    11   /*  for (int i = 5; i>0; i--) {
    12         printf("%5d", a[i-1]);
    13     }*/
    14     //升序排列
    15   for (int i = 0; i<5; i++) {
    16       printf("%5d", a[i]);
    17   }
    18 
    19 }
    20 
    21 //快速排序
    22 qsort(int l, int r)//应用二分思想
    23 {
    24     int mid = a[(l + r) / 2];//中间数
    25     int i = l, j = r;
    26     do {
    27         while (a[i] < mid)
    28             i++;//查找左半部分比中间数大的数
    29         while (a[j] > mid)
    30             j--;//查找右半部分比中间数小的数
    31         if (i <= j)//如果有一组不满足排序条件(左小右大)的数
    32         {
    33             swap(i, j);//交换
    34             i++;
    35             j--;
    36         }
    37     } while (i <= j);
    38     if (l < j)
    39         qsort(l, j);//递归搜索左半部分
    40     if (i < r)
    41         qsort(i, r);//递归搜索右半部分
    42 }
    43 swap(int i, int j)
    44 {
    45     int temp = a[i];
    46     a[i] = a[j];
    47     a[j] = temp;
    48 }
  • 相关阅读:
    Java中List集合的常用方法
    hibernate的多对多配置
    hibernate的一对多配置
    Github删除账号方法
    eclipse向上/下复制一行(或者多行)的快捷键失效的基本解决方法
    eclipse格式化代码快捷键失效解决的一个基本方法
    hibernate配置文件的详解
    hibernate——第一次简单的使用
    java中TreeMap集合的常用方法
    java中Map集合的常用方法
  • 原文地址:https://www.cnblogs.com/zonzi/p/12975273.html
Copyright © 2020-2023  润新知