快速排序(正序+倒序)C语言版
2021-01-28 20:13
806 查看
正序
#include <stdio.h> void sort(int *, int, int); void sort(int arr[], int left, int right) { // 如果数组(子数组)只有1个元素时直接返回 if (left == right) { return; } // i为左向右移动位置指针,j为右向左移动位置指针 int i, j, tmp; // 第1个元素作为本轮排序的参考值 i = left + 1; j = right; while (i < j) { // 必须j先查找,条件匹配即停止 // while (i < j && arr[j] > arr[left]) { while (i < j && !(arr[j] <= arr[left])) { j--; } // i开始查找,条件匹配即停止 // while (i < j && arr[i] <= arr[left]) { while (i < j && !(arr[i] > arr[left])) { i++; } // 交换i和j位置的数值,可能是两个位置,也可能是同位置(虽然多余,但不影响结果) tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } // 执行到这里本轮的i,j查找已经结束,且两者位置重合,重合位置为拆分数组的分隔点 // 参考值>i位置交换(因本次为正序) if (arr[left] > arr[i]) { tmp = arr[left]; arr[left] = arr[i]; arr[i] = tmp; } // 拆分为2个数组递归,左子数组不包含拆分点,右数组在至少包含拆分点本身1个元素(在本轮子数组为2个元素时的情况) sort(arr, left, i - 1); sort(arr, i, right); } int main(void) { int arr[] = {12, 3, 7, 25, 11, 5, 23, 5, 0}; int length; length = sizeof(arr) / sizeof(int); sort(arr, 0, length - 1); printf("-------------------\n"); for ( int i = 0; i < length; i++ ) { printf("%d, ", arr[i]); } printf("\n"); return 0; }
倒序
#include <stdio.h> void sort(int *, int, int); void sort(int arr[], int left, int right) { if (left == right) { return; } int i, j, tmp; i = left + 1; j = right; while (i < j) { while (i < j && arr[j] < arr[left]) { //while (i < j && !(arr[j] >= arr[left])) { j--; } while (i < j && arr[i] >= arr[left]) { //while (i < j && !(arr[i] < arr[left])) { i++; } tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } if (arr[left] < arr[i]) { tmp = arr[left]; arr[left] = arr[i]; arr[i] = tmp; } sort(arr, left, i - 1); sort(arr, i, right); } int main(void) { int arr[] = {12, 3, 7, 25, 11, 5, 23, 5, 0}; int length; length = sizeof(arr) / sizeof(int); sort(arr, 0, length - 1); printf("-------------------\n"); for ( int i = 0; i < length; i++ ) { printf("%d, ", arr[i]); } printf("\n"); return 0; }
相关文章推荐
- GridView 加排序序号(正序,倒序)
- Android中点击实现listView正序和倒序的切换
- 题目及解答:策略模式+泛型(对Person类按姓名、id、年龄正序、倒序排序)
- List<Object>使用Object的某个属性进行排序(正序,倒序)
- 快速排序(C语言版)
- 插入排序(正序、倒序)-c++代码实现及运行实例结果
- javascript 冒泡排序 正序和倒序实现代码
- 输出一组不超过五位的数字的位数 及正序、倒序输出每一位问题
- 算法题:2.判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 冒泡排序实现一组数 正序和倒序排列
- GridView 序号 排序 正序 倒序
- 递归实现链表的正序和倒序输出
- Lua中使用table生成链表完成正序和倒序的文件读入
- JAVA版List<Map>排序,按字符或数字类型排序,支持正序倒序
- php foreach正序倒序输出示例代码
- 插入排序(正序、倒序)-c++代码实现及运行实例结果
- 基础算法——快速排序(C语言版)
- GridView 序号 排序 正序 倒序
- List的正序和倒序排列
- C# 经典算法 冒泡排序法(正序,倒序)