算法-快速排序

快速排序,顾名思义就是能够将序列快速排序的方法,在同为O(N*logN)的几种排序方法中效率较高的。
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

快速排序的核心思想:
1、先从数组中随机选取一个数作为基准数,一般默认为数组的第一个数,即arr[0];
2、分区,将基准数移到序列中间的某个位置,并实现基准数左边的数小于等于基准数,基准数右边的数大于基准数;
3、将基准数左右两边的序列当成两个新的数组,重复进行1,2步骤,直到所有的分区排序完成。

代码逻辑:
1、对数组{3, 9, 1, 7, 8, 4, 2, 5, 6}进行排序,首先选取基准数arr[0]=3,
2、将这个数组中所有比基准数3大的数放在3的右边,比基准数3小的数放在3的左边;
2.1、从数组右边开始判断,寻找比基准数小的数,这里是arr[6],2比3小,将其放在arr[0]的位置,即arr[0]=arr[6],此时右边开始的下标为6,
然后再从做左边arr[0],就是3后寻找比基准数大的数,这里是arr[1],9比3大,将其放在arr[6]的位置,即arr[6]=arr[1],此时左边开始的下标为1,
然后继续从右边arr[6],就是2后开始寻找比基准数小的数,这里找到了arr[2],1比3小,将其放在arr[1]的位置,即arr[1]=arr[2],此时右边开始的下标为2,
然后再从做左边arr[1],就是9后寻找比基准数大的数,这时候发现右边已经寻找到下标2了,左边继续寻找是1+1已经不小于右边下标2,循环结束,并将基准值3赋值给arr[1+1]=3;
2.2、此时排序是{2, 1, 3, 7, 8, 4,9, 5, 6},实现了基准数3左边的数小于等于基准数,基准数右边的数大于基准数;
2.3、以基准数为中心,分隔数组,将数组{2, 1, 3, 7, 8, 4,9, 5, 6}分成两段,即{2, 1}和{7, 8, 4,9, 5, 6},然后将两数组分别重复之前的操作。

代码实现:


	int[] arr3 = {3, 9, 1, 7, 8, 4, 2, 5, 6};
	quickSort(arr3, 0, arr3.length - 1);

	/**
     * 快速排序
     *
     * {3, 9, 1, 7, 8, 4, 2, 5, 6}
     */
    public void quickSort(int arr[], int start, int end) {
        if (start < end) {
            int flag = getFlagArray(arr, start, end);
            quickSort(arr, start, flag - 1);
            quickSort(arr, flag + 1, end);
        }
    }

    /**
     * 获取调整后基准值对应所在的数组位置
     *
     * @param arr
     * @param start
     * @param end
     * @return
     */
    public int getFlagArray(int[] arr, int start, int end) {
        int flag = arr[start];//基准值,默认使用数组的第一个数
        int i = start, j = end;
        while (i < j) {
            //先从右边开始,找出比基准值小的数
            while (i < j && arr[j] >= flag) {
                j--;
            }
            if (i < j) {
                arr[i] = arr[j];
                i++;
            }
            //从左边开始,找出比基准值大的数
            while (i < j && arr[i] < flag) {
                i++;
            }
            if (i < j) {
                arr[j] = arr[i];
                j--;
            }
        }
        arr[i] = flag;
        return i;
    }
C语言是一种广泛应用于系统编程和嵌入式开发的高级编程语言。函数指针是C语言中的一个重要概念,它可以指向函数,并且可以通过函数指针来调用函数。快速排序算法是一种常用的排序算法,它的核心思想是通过分治的策略将一个大问题分解为多个小问题,并通过递归的方式解决这些小问题。 下面是C语言中使用函数指针实现快速排序算法的示例代码: ```c #include <stdio.h> // 交换两个元素的值 void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } // 快速排序的分区函数 int partition(int arr[], int low, int high) { int pivot = arr[high]; // 选取最后一个元素作为基准 int i = (low - 1); // 定义一个指针,用于指向小于基准的元素 for (int j = low; j <= high - 1; j++) { if (arr[j] < pivot) { i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); return (i + 1); } // 快速排序函数 void quickSort(int arr[], int low, int high) { if (low < high) { int pi = partition(arr, low, high); // 将数组分区,并获取分区点的位置 quickSort(arr, low, pi - 1); // 对分区点左边的子数组进行快速排序 quickSort(arr, pi + 1, high); // 对分区点右边的子数组进行快速排序 } } // 打印数组元素 void printArray(int arr[], int size) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { int arr[] = {10, 7, 8, 9, 1, 5}; int n = sizeof(arr) / sizeof(arr[0]); printf("原始数组:"); printArray(arr, n); quickSort(arr, 0, n - 1); printf("排序后的数组:"); printArray(arr, n); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sziitjin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值