高级排序--快速排序

排序原理:
1.首先设定一个分界值,通过该分界值将数组分成左右两部分;
2.将大于或等于分界值的数据放到到数组右边,小于分界值的数据放到数组的左边。此时左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值;
3.然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
4.重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左侧和右侧两个部分的数据排完序后,整个数组的排序也就完成了。
排序过程:
例::{6, 1, 2, 7, 9, 3, 4, 5, 8}

切分原理:
把一个数组切分成两个子数组的基本思想:
1.找一个基准值,用两个指针分别指向数组的头部和尾部;
2.先从尾部向头部开始搜索一个比基准值小的元素,搜索到即停止,并记录指针的位置;
3.再从头部向尾部开始搜索一个比基准值大的元素,搜索到即停止,并记录指针的位置;
4.交换当前左边指针位置和右边指针位置的元素;
5.重复2,3,4步骤,直到左边指针的值大于右边指针的值停止。

package com.sort;
/*--------------
 *  Author:Real_Q
 *  Date:2021-01-09
 *  Time:11:53
 *  Description:快速排序
---------------*/
public class QuickSort {
    //定义排序函数
    public static void quickSort(int[] array) {
        int low = 0;
        int high = array.length - 1;
        quickSort(array, low, high);
    }

    //重载排序函数
    public static void quickSort(int[] array, int low, int high) {
        if (low >= high) {
            return;
        }
        int index = partition(array, low, high);
        quickSort(array, low, index - 1);
        quickSort(array, index + 1, high);
    }

    //核心函数 获取基准值的索引并且返回(基准值从首元素开始找,找到合适的为返回索引)
    public static int partition(int[] array, int low, int high) {
        //基准值
        int key = array[low];
        //指向尾部
        int left = low;
        //指向头部
        int right = high + 1;
        while (true) {
            //2.先从尾部向头部开始搜索一个比基准值小的元素,搜索到即停止,并记录指针的位置;
            while (less(key, array[--right])) {
                if (right <= low) {
                    break;
                }
            }
            //3.再从头部向尾部开始搜索一个比基准值大的元素,搜索到即停止,并记录指针的位置;
            while (less(array[++left], key)) {
                if (left >= high) {
                    break;
                }
            }
            //4.交换当前左边指针位置和右边指针位置的元素;
            if (left >= right) {//left和right相遇,left == right,遍历完了 跳出循环
                break;
            } else {//符合条件 交换eft和right索引值
                exchange(array, left, right);
            }
        }

        //把key与right处的索引值交换,并且返回索引
        exchange(array, low, right);
        return right;
    }

    //比较两个元素的大小,返回比较结果
    public static boolean less(int a, int b) {
        return ((a - b) < 0);
    }

    //交换数组中的两个元素
    public static void exchange(int[] array, int index1, int index2) {
        int temp;
        temp = array[index1];
        array[index1] = array[index2];
        array[index2] = temp;
    }
}

测试类:
package com.testsort;
import java.util.Arrays;
import static com.sort.QuickSort.quickSort;
/*--------------
 *  Author:Real_Q
 *  Date:2021-01-09
 *  Time:14:36
 *  Description:
---------------*/
public class TestQuick {
    public static void main(String[] args) {
        //int[] array = {8,4,5,7,1,3,6,2};
        int[] array = {6, 1, 2, 7, 9, 3, 4, 5, 8};
        quickSort(array);
        System.out.println(Arrays.toString(array));
    }
}

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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值