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

时间:2020-05-27
本文章向大家介绍分治法? 递归? 快速排序 C语言,主要包括分治法? 递归? 快速排序 C语言使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

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

 写法一:

 1 static void fast() {
 2     printf("\n"); printf("快速排序请输入:"); printf("\n");
 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("\n");
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 }

原文地址:https://www.cnblogs.com/zonzi/p/12975273.html