快速排序
来源:互联网 发布:python exit code 9 编辑:程序博客网 时间:2024/06/04 18:47
快速排序算法的基本思想是,对于输入的子数组arr[b:e],按一下三个步骤进行排序:
(1) 分解:以arr[b]为基准将arr[b:e]划分为三段arr[b:t-1],arr[t],arr[t+1:e],使arr[b:t-1]中的任何一个元素小于等于arr[t],而arr[t+1:e]中的任何一个元素大于等于arr[t]。下标t在划分过程中确定。
(2) 递归求解:通过递归调用快速排序算法分别对arr[b:t-1]和arr[t+1:e]进行排序。
(3) 合并:由于对arr[b:t-1]和arr[t+1:e]的排序是就地进行的,所以在arr[b:t-1]和arr[t+1:e]排序后,不需求再进行任何计算。
代码实现:
#include <stdio.h>#include <stdlib.h>#include <time.h>typedef int TYPE;#define PRINT_FORMAT "%-3d "#define ARR_LEN 100int main(void) {void get_random_arr(TYPE arr[], int len);void print_arr(TYPE arr[], int len);void quick_sort(TYPE arr[], int len);TYPE arr[ARR_LEN];get_random_arr(arr, ARR_LEN);printf("Befor Sorting:\n"); print_arr(arr, ARR_LEN);quick_sort(arr, ARR_LEN);printf("After Sorting:\n");print_arr(arr, ARR_LEN);return EXIT_SUCCESS;}/*** 快速排序*/void quick_sort(TYPE arr[], int len) {void q_sort(TYPE arr[], int begin, int end);q_sort(arr, 0, len-1);}/*** 对数组arr[begin:end]进去快速排序*/void q_sort(TYPE arr[], int begin, int end) {int partition(TYPE arr[], int begin, int end);int base_pos;if (begin < end) {base_pos = partition(arr, begin, end);/*** 对左区域排序*/q_sort(arr, begin, base_pos-1);/*** 对右区域排序*/q_sort(arr, base_pos+1, end);}}/*** 将对arr[begin:end]以arr[begin]作为基准进行划分,** 大于基准的元素置于左区域,** 小于基准的元素置于右区域。** 将基准元素置于确定好的位置,并返回其位置*/int partition(TYPE arr[], int begin, int end) {void swap(TYPE *a, TYPE *b);TYPE base = arr[begin];// 以arr[begin]作为基准int i = begin;int j = end + 1;while (1) {/*** 将小于base的元素放在左区域,** 将大于base的元素放在右区域。*/while (arr[++i] < base && i < end);while (arr[--j] > base);if (i >= j) break;swap(&arr[i], &arr[j]);}arr[begin] = arr[j];arr[j] = base;return j;}void swap(TYPE *a, TYPE *b) {TYPE tmp = *a;*a = *b;*b = tmp;}/*** 简单地获取随机数组*/void get_random_arr(TYPE arr[], int len) {int i;srand((unsigned int)time(NULL));for (i = 0; i < len; i++) {arr[i] = rand() % 100;}}/*** 打印数组*/void print_arr(TYPE arr[], int len) {int i;for (i = 0; i < len; i++) {printf(PRINT_FORMAT, arr[i]);if ((i + 1) % 10 == 0) putchar('\n');}putchar('\n');}结果输出:
Befor Sorting:58 71 50 78 10 96 32 35 43 5652 81 72 85 57 68 65 88 41 5552 30 88 50 12 32 36 57 67 4611 28 98 66 2 37 50 55 63 7361 92 9 19 29 55 94 62 56 9818 97 33 76 83 12 39 95 24 4091 4 41 22 46 71 43 33 31 9036 41 82 60 10 92 74 39 84 5152 73 17 88 56 41 23 3 36 3483 50 79 88 76 97 83 7 41 53After Sorting:2 3 4 7 9 10 10 11 12 1217 18 19 22 23 24 28 29 30 3132 32 33 33 34 35 36 36 36 3739 39 40 41 41 41 41 41 43 4346 46 50 50 50 50 51 52 52 5253 55 55 55 56 56 56 57 57 5860 61 62 63 65 66 67 68 71 7172 73 73 74 76 76 78 79 81 8283 83 83 84 85 88 88 88 88 9091 92 92 94 95 96 97 97 98 98
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- Python中处理HTTP协议的库:urllib2
- Oracle 字符集的查看和修改
- C++处理UTF8编码的字符串
- 十五、从互联网获取图片且保存到指定目录
- 静态库和动态库的区别
- 快速排序
- jqModal点击弹窗外背景不关闭弹窗
- CWnd与HWND的区别与转换
- Exchange 2010 修改队列数据库地址&变更日志路径!
- SQL中JOIN和UNION区别、用法及示例介绍
- VC 应用间通信,WM_COPYDATA,WM_SETTEXT
- 收集统计信息导致索引被监控
- 如何完美的将对话框设置成无边框无标题栏样式?
- VC高版本编译早期代码常见错误...