算法【快速排序】

打印 上一主题 下一主题

主题 912|帖子 912|积分 2736

算法【快速排序】

快速排序。选择一个作为比较的元素,这里我们选择首元素,这个元素我叫他‘比较元素’;前后两个指针(其实是索引变量)同时往后和往前进行遍历,开头的指针遇到比‘比较元素’大的元素停下来(空循环体的循环即可实现),末尾的指针往前遍历,遇到比‘比较元素’小的元素停下来;两个元素都停止后,交换两个元素,交换后通过外面的大循环继续让指针运动起来;当两个指针相遇或交错时,退出大循环;之后将从后面跑来的指针的元素与‘比较元素(首元素)’交换(因为这时这个从后面跑来的指针一定指向小于或等于首元素的元素),这样可以保证后面跑来的这个指针的位置元素,前面都是小于它的元素,后面都是大于它的元素;之后前面的进行递归,后面的也进行递归,递归的出口是开始的指针大于等于结束的指针(这个开始和结束的指针是上一个大的部分传来的)。
[code]#include #include #include #define N 10/** *  快排*/void quick_sort(int *arr, int size);void recursion(int *arr, int start, int end);// 快排void quick_sort(int *arr, int size){    recursion(arr, 0, size-1);}// 快排的递归逻辑void recursion(int *arr, int start, int end){    // 第一个作为比较的元素    int comElement = arr[start];    // 后面首元素的下标和尾元素的下标都要改变,现在先记录一下。    int start_temp = start;    int end_temp = end;    if(start_temp =start_temp && comElement < arr[end--]);     // 后元素小于起始元素 或 该位置元素小于等于比较元素时停止后移        end++;      // 将最后往前移多的下标加上。        if(start >= end) break;     // 后位置大于前位置,不进行交换        // 这里不能使用异或 或者 相加 的方式交换, 因为可能操作的是同一个元素。        int temp = arr[start];        arr[start] = arr[end];        arr[end] = temp;        }        int temp = arr[start_temp];        arr[start_temp] = arr[end];        arr[end] = temp;        static int x_20231217 = 1;        printf("第%d趟排序结果为:\t", x_20231217++);        for(int i = 0; i
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

缠丝猫

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表