C语言和快速排序以及一些想法
来源:互联网 发布:java compareto返回值 编辑:程序博客网 时间:2024/05/23 02:03
#include<stdio.h>int quick_sort(int num[], int left, int right);int main(){ int li[] = {8,12,5,9,2,11,28,1,9,}; int n = sizeof(li)/sizeof(li[0]); quick_sort(li,0,n-1); int i; for (i = 0;i<n;i++){ printf("数组第%d个数是%d\n",(i+1),li[i]); } return 0;}int quick_sort(int num[], int left, int right){ if (right <= left){ return 0; } int std = num[left]; int i = left; int j = right; int temp; while(j > i){ while(j>i){ if(num[j] >= std){ j --; }else{ num[i] = num[j]; num[j] = std; break; } } while(j > i){ if(num[i] < std){ i++; }else{ num[j] = num[i]; num[i] = std; break; } } } quick_sort(num,left,i); quick_sort(num,i+1,right);}
有价值的思考在用python实现快速排序后基本上都说了,C语言也没什么好说的了。
时隔多日再次复现快速排序,一开始卡在怎么让小于基准数的在一端,大于基准数的在一端。
我错误的思路:单纯从一侧比。。
比如说 8 9 10 4 5;
把8当做基准数,5比8小,则把5和8交换位置:5 9 10 4 8;
然后4和8比,又小,则再交换位置5 9 10 8 4;
10,9比8大,不动。。
然后又轮到5,最后变成了 8 9 10 5 4。。。。
正确的想法是,既然不要求较大组中是有序的,也就是最右边的最大,那只要遇到比基准数大的,就放到最右边。再朋友一个,放次右边。较小组同理啊,只要碰到一个小的,就放到最左边,再碰到一个,放到第二位。最后就会把基准数夹到了中间。
而由于把最左边的数保存在了基准数中,结合挖坑思想,应该先找比它小的。
而这个比它小的,为何是从右边找起呢?因为如果右边第一个数比基准数大,那没事儿,不懂它;或者看做原地挖坑原地埋,然后继续向前找,假设倒数第二个比基准数小了,那就可以把它放到之前的那个坑中。你想,那倒数第二个数的值已经到了之前的坑里,它本身的位置就是一个坑了呀!这时候就又要找比基准数大的数去填充,然后再从左边开找,找到一个比它小的去填充,这样左边又多了一个可以用来填从右边找到的较小的数的坑~~这样就形成了良性循环,最后两边就会在一个位置上撞上,从左边找小的超过位置,碰到的都是比基准数大的,从右边找大的超过这个位置,又都是小的。那这个位置就用来放基准数啦。
不过我这里漏掉了等于的情况,这个必须被左边找过来或者右边找过去的一个考虑。否则可能会陷入死循环。
而如果说把最左边的数当做基准数,从左边找起,首先要放在最左边嘛,那肯定还要找一个比它小的。假设数0(坑0)是左边第一个数,作为基准数它的值已经在std或者temp或者什么变量里了,所以可以填入其他东西。从左边找起,假设数1比数0大,数2比数0小,那数2的值填到坑0里面,它自己变成了坑1。然而,此时基准数的位置应该在数0和数1之间了,请问要怎么样才可以在数0和数1里面凭空挖出一个坑?这就必须把整组数据后移一个坑。。。所以这样做是要不得的。
- C语言和快速排序以及一些想法
- c语言归并排序和快速排序
- C语言实现插入排序与希尔排序与一些想法
- 快速排序--C语言
- 快速排序C语言
- 快速排序--C语言
- C语言快速排序
- 快速排序--C语言
- C语言:快速排序
- c语言快速排序
- C语言快速排序
- C语言 快速排序
- 【C语言】快速排序
- C语言快速排序
- C语言快速排序
- C语言快速排序
- C语言快速排序
- C语言:快速排序
- ubuntu上利用qemu-kvm创建虚拟机
- 面向对象的思想
- CSS实战(4)
- 如何在CentOS 7安装和配置ownCloud
- 【Python】学习笔记——-6.0、模块
- C语言和快速排序以及一些想法
- Lecture 4 Microphone
- Ubuntu 12.04 LTS apt-get connect refuse Unable to connect to 127.0.0.1:8888:
- 【JSOI2015】非诚勿扰
- JQuery操作<select>元素
- 新增商品时候改变商品在所选分类中的默认排序
- 【Python】学习笔记——-6.1、使用模块
- 如何手机访问电脑服务器上的网页?
- 选择照片、拍照裁剪上传