快速排序算法
来源:互联网 发布:js怎么获取当前日期 编辑:程序博客网 时间:2024/04/29 23:03
在前面博客有写英文版的快速查找实现例子,在复习的时候,有了新的领悟。
【思想】
快速排序算法关键在于先在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的移动到数组左边,比选择的数字大的移动到数组的右边。
【实例说明】
快速排序数组data[] = {2,4,9,3,6,7,1,5},设置第一个数为基准值,将其他元素与其进行比较,数组长度为8,设置两个指针i,j分别指向待排序数组首末下标,待比较情况进行移动:
第一组排序:
以基准值basis = data[0] = 2对数组进行划分调整顺序,让小于2的都在它的左边,大于2的都在它的右边,具体实现思想为,先对data[j]进行操作,当data[j]> basis, j减1,向前移动一个,否则将data[j]的值填补data[i],data[j]就变成下次待填补对象,i此时向后移动一格,并开始对data[i]进行操作,如果data[i]< basis,i加1,向后移动一格,否则就将data[i]的值填补此时的data[j],data[i]此时变成待填补对象,j向前移动,重复前面的步骤,直到i = j时,说明全部比较完了,填补此时data[i]的位置,如此便能得到以基准值划分出来的左边小于basis,右边大于basis的情况。过程如下图所示:
这一组排序以basis = data[i],i = 0,j = 7,排序后得到的数组{1,2,9,3,6,7,4,5}
第二组排序:i = 0 , j = 0, basis = data[i] =1,排序后得到的数组{1,2,9,3,6,7,4,5}
第三组排序:i = 2, j=7, basis = data[i] = 9,排序后得到的数组{1,2,5,3,6,7,4,9}
第四组排序:i=2,j=6,basis = data [2] = 5,排序后得到的数组{1,2,4,3,5,7,6,9}
第五组排序:i = 2,j = 3,,basis = data[2] = 4,排序后得到的数组{1,2,3,4,5,7,6,9}
第五组排序:i = 5,j = 6,basis = data[5] = 7,排序后得到的数组{1,2,3,4,5,6,7,9}
【测试代码】
#include<stdio.h>void quicksort(int data[],int lo,int hi){ if(lo>=hi) return; int i=lo , j=hi; int basis = data[lo]; while(i < j) { while((data[j] > basis)&&(i<j)) j-- ; if(i<j)//这块一定要有这个判断,否则会出错 { data[i++] = data[j]; } while((data[i] < basis)&&(i<j)) i++; if(i<j) { data[j--] = data[i]; } } data[ i ] = basis; quicksort(data, lo, i-1 ); quicksort(data, i+1, hi);}int main(){ int i; int data[] = {2,4,9,3,6,7,1,5}; quicksort(data , 0 , 7); for(i=0;i<8;i++) printf("%d ",data[i]); return 0;}
【输出】
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法---快速排序
- 排序算法-快速排序
- 排序算法------快速排序
- 排序算法---快速排序
- 排序算法-快速排序
- 排序算法---快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法:快速排序
- 排序算法 快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 【排序算法】快速排序
- 排序算法--快速排序
- 排序算法:快速排序
- POJ 1741(树分治)
- 南宁如何治疗大便带血
- HDU 2075 A|B?
- 南宁得肛瘘不能吃什么
- 南宁割肛瘘需要住院吗
- 快速排序算法
- 南宁什么药治肛瘘最好
- 南宁治疗肛瘘最好的药
- java 基础代码
- Android学习心得(3) --- MAC下Android源代码下载
- How to Solve Error #1045 in phpMyAdmin
- 南宁肛瘘都有什么症状
- 南宁有轻微肛瘘怎么办
- 题目1386:旋转数组的最小数字