数据结构与算法---------快速排序

实现思想

    快速排序的基本思想如下:

    1、从待排序列中任选一个元素作为枢轴;

    2、将序列中比枢轴大的元素全部放在枢轴的右边,比枢轴小的元素全部放在其左边;

    3、以枢轴为分界线,对其两边的两个子序列重复执行步骤1和2中的操作,直到最后每个子序列中只有一个元素。

    一趟快速排序(以排序后从小到大为例)的具体做法如下:

    附设两个元素指针low和high,初值分别为该序列的第一个元素的序号和最后一个元素的序号,设枢轴元素的值为val,则首先从high所指位置起向前搜索到第一个值小于val的元素,并将其和val互换位置,而后从low所指位置起向后搜索到第一个值大于val的元素,并将其和val交换位置,如此反复 ,直到low=high为止。

    我们上面说交换位置,只是为了便于理解,我们在前面几篇内部排序的博文中一直在强调,应尽量避免比较多的元素交换操作,因此下面的分析和代码的实现中,我们并不是采取交换操作,而是先将枢轴元素保存在val变量中,然后每次遇到需要交换的元素时,先将该元素赋给val所在的位置,而后再将该元素所在位置“挖空”,之后的每一次比较,就用需要交换的元素来填充上次“挖空”的位置,同时将交换过来的元素所在的位置再“挖空”,以等待下次填充。

/*******************************
  快速排序
Author:兰亭风雨 Date:2014-02-28
Email:zyb_maodun@163.com
********************************/
#include<stdio.h>
#include<stdlib.h>


void Quick_Sort(int *,int,int);
int findPoss(int *,int,int);


int main()
{
int num; 
printf("请输入排序的元素的个数:");
scanf("%d",&num);


int i;
int *arr = (int *)malloc(num*sizeof(int));
printf("请依次输入这%d个元素(必须为整数):",num);
for(i=0;i<num;i++)
scanf("%d",arr+i);


printf("快速排序后的顺序:");
Quick_Sort(arr,0,num-1);
for(i=0;i<num;i++)
printf("%d ",arr[i]);
printf("\n");


free(arr);
arr = 0;
return 0;
}


/*
快速排序函数,通过递归实现
*/
void Quick_Sort(int *a,int low,int high)
{
int pos;


if(low < high)
{
  pos = findPoss(a,low,high);
  Quick_Sort(a,low,pos-1); //左边子序列排序
  Quick_Sort(a,pos+1,high); //右边子序列排序 
}
}


/*
该函数返回分割点数值所在的位置,a为待排序数组的首地址,
low刚开始表示排序范围内的第一个元素的位置,逐渐向右移动,
high刚开始表示排序范围内的最后一个位置,逐渐向左移动
*/
int findPoss(int *a,int low,int high)
{
int val = a[low];
while(low < high)
{
  while(low<high && a[high]>=val)
     high--;
  a[low] = a[high];


  while(low<high && a[low]<=val)
     low++;
  a[high] = a[low];     
}


//最终low=high
a[low] = val;
return low;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值