标签:
已经很久没有发表博文了,人生中有很多噼里啪啦的事情让我们在这个世界中过得坎坎坷坷,跌宕起伏,就和力哥说的一样用平常心去看待吧,这也算的上一个自我安慰吧,加油,相信自己永远是最棒的!
大致思想:
首先是运用了分治的思想,同时不同与分治排序一样,这个算法的思想主要是在一段无序数组中选取一个数字作为一个中间值,然后将这个数组中的数字以这个中间值为基准各自分往数组的两边。
代码:
/*************************************************************************
> File Name: 1076.c
> Author:
> Mail:
> Created Time: 2015年06月18日 星期四 20时51分31秒
************************************************************************/
//快速排序
//输入n个数,进行排序
//输入:
//5
//5 4 3 2 1
//输出:
//1 2 3 4 5
//
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int i,j,k,n,a[100002];
int partition(int low,int high)
{
//这个a[0]就是用来这段数组中
//设定的中间值,往往我们用这
//段数组中的第一个值,当然如
//果为了避免出现最坏的情况出
//现,我们可以有 low-high 的
//随机位置作为设定的中间值。
a[0]=a[low];
//这段代码需要自己动手模拟一
//遍,意思就是上面我已经述说
//了一遍了,代码自己手动模拟
//一个即可明白。
//注意:a[0]是假设的中间值。
while(low<high){
while(a[high]>a[0]&&low<high)high--;
if(low<high)a[low++]=a[high];
while(a[low]<a[0]&&low<high)low++;
if(low<high)a[high++]=a[low];
}
a[low]=a[0];
return low;
}
void init()
{
memset(a,0,sizeof(a));
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
}
void my_Quicksort(int low,int high)
{
//首先利用分而治之的思想将一段数组截
//成两节
if(low<high)
{
int mid = partition(low,high);//进入一次快排处理
my_Quicksort(low,mid-1);
my_Quicksort(mid+1,high);
}
}
void print()
{
for(i=1;i<=n;i++)
{
printf("%d ",a[i]);
}
}
int main()
{
init();
my_Quicksort(1,n);
print();
return 0;
}
标签:
原文地址:http://blog.csdn.net/qq_14949289/article/details/46561161