快速排序和归并排序
来源:互联网 发布:淘宝手机端优惠券设置 编辑:程序博客网 时间:2024/05/30 20:07
快速排序和归并排序
- 快速排序
- 归并排序
阅读之前注意:
本文阅读建议用时:20min
本文阅读结构如下表:
快速排序
快速排序(我们以升序为例)的关键在于:
- 把第一个值看做是枢纽值(pivot),利用两个坐标把这个枢纽值传到序列的合适位置,使得左边的值均比枢纽值小,右边的值均比枢纽值大
- 对枢纽值左边的序列(不包括枢纽值)做第一步的处理,对枢纽值右边的序列也做第一步的处理。直至被处理的序列只有一个数。
参考以下代码:1
#include<stdio.h>#include<stdlib.h>void swap(int *a,int low,int high)//交换{ int tmp = a[low]; a[low] = a[high]; a[high] = tmp;}int partition(int *a,int low,int high)//寻找枢纽值{ while (low < high) { while ((low<high) && (a[low]<a[high])) high--; swap(a, low, high); while ((low < high) && (a[low] < a[high])) low++; swap(a, low, high); } return low;//当low=high时,坐标即枢纽}void quickSort(int *a,int low,int high)//快速排序{ if (low >= high) return;//退出条件 int pivot = partition(a, low, high);//第一步,寻找枢纽值 quickSort(a, low, pivot - 1);//对枢纽值左边的序列快速排序 quickSort(a, pivot + 1, high);//对枢纽值右边的序列快速排序}void main(){ int a[10] = { 1, 9, 5, 4, 2, 7, 8, 6, 3, 0 }; quickSort(a, 0, 9); for (int i = 0; i < 10; i++) printf("%d ", a[i]); system("pause");}
归并排序
归并排序(我们以升序为例)的关键在于:
- 对整个序列等分,之后对左序列等分,对右序列等分,直至最后被等分的序列成为单个数。再从单个数开始不断归并(merge),归并后的序列是有序的,这样子的左序列和右序列再归并还是有序的。
参考以下代码:
#include<stdio.h>#include<stdlib.h>void merge(int *des,int *src,int size,int low,int mid,int high)//归并{ int i = low; int j = 0; int k = 0; j = mid + 1; while ((low <= mid) && (j <= high)) { if (src[low] < src[j]) des[i++] = src[low++]; else des[i++] = src[j++]; } while (low <= mid) des[i++] = src[low++]; while (j <= high) des[i++] = src[j++];}void sort(int *des, int *src, int size,int low,int high)//归并排序{ if (low == high) { des[low] = src[low];//重要 return; } int *space = (int *)malloc(size*sizeof(int));//开辟临时空间 int mid = (low + high) / 2;//等分 sort(space, src, size, low, mid);//对左序列归并排序 sort(space, src, size, mid + 1, high);//对有序列归并排序 merge(des, space, size, low, mid, high);//把左序列和右序列归并 free(space);}void main(){ int a[10] = { 1, 9, 4, 7, 3, 2, 5, 6, 0, 8 }; int b[10] = { 0 }; sort(b, a, 10, 0, 9); for (int i = 0; i < 10; i++) printf("%d ", b[i]); system("pause");}
快速排序和归并排序其实都是分而治之,其中归并排序不仅需要化整为零,还需要化零为整。2
- 快速排序和归并排序
- 阅读之前注意
- 快速排序
- 归并排序
- 程序基于王保明先生的讲课内容. ↩
- 程序基于王保明先生的讲课内容. ↩
阅读全文
0 0
- 快速排序和归并排序
- 归并排序和快速排序
- 归并排序和快速排序
- 归并排序和快速排序
- 归并排序和快速排序
- 归并排序和快速排序
- 归并排序和快速排序
- 快速排序和归并排序
- 归并排序和快速排序
- 快速排序和归并排序
- 排序:快速排序和归并排序
- 排序之归并排序和快速排序
- 冒泡、归并和快速排序
- 归并排序和快速排序算法实现
- 归并排序和快速排序的比较
- 快速排序和归并排序区别
- Python算法 归并排序和快速排序
- 归并排序和快速排序的浅析
- Roman to Integer 罗马数字转化成整数
- 遗传算法的基本原理和matlab实现
- vim 编辑python的一些设置
- Labview-运行崩溃,报错AccessViolation
- (二十)线程
- 快速排序和归并排序
- Android 设备唯一标识符之 MAC 地址
- quartz框架之spring整合
- 分配问题与匈牙利法
- Struts2 入门
- leetcode在线编程---树(java)
- Studio One 3.5.4 for Mac(音乐制作软件)附注册机 V3.5.4中文破解版
- Sublime Text 3 装了Anaconda 写Python代码出现框框的解决办法
- Ubuntu14.04系统10分钟搭建JavaWeb常用运行环境(jdk+tomcat+mysql+phpmyadmin)