快速排序

                                快速排序

  什么是快速排序?快速排序其实是一种排序方法。

其他不啰说;

  基本原理:给出一堆无序的数,首先重这堆数值中一第一个数为标杆(其他数也可以不过为了方便编程就选着第一个数为标杆),标杆选出后,将这堆无序数分成两堆,比标杆小的分到一堆,比标杆大的分到另一堆,这样就有两堆数了。接着按照同样的方法为这两堆数进行快速排序。

  写代码时第一步,找出标杆,以标杆为中心将比标杆小的数放到标杆右边,比标杆大的放到左边;在分别进入左右两边进行快排;

  假如 start 为数组起点 end为数组终点 排序函数为sort();k 为标杆在数组中的下标;

  (1)sort(start,end)

  (2)sort(start,k-1)

  (3)sort(k+1,end)

 

 

 

 

 

实例:

给出数组为 3 1 2 6 4 



 

//快速 排序
//从一堆数中 那第一个数为标杆 把大于标杆的数放在标杆的左边,
//把小于标杆的数放在标杆的右边。将数放好后分别进入左右子段
//进行下一轮的快排 直到子段长度为1;
#include<iostream>
using namespace std;
const int maxn=10;
int number[maxn];
int n;
void sort(int start,int end)
{
    if(start>=end)
        return;
    int i;//从右边移动
    int j;//从左边移动
    int k;//记录最后一个移动位置的数的位置;
    int mid;//标杆
    i=start;//该段的第一位为标杆 把第一个位空出来
    j=end;
    k=start;

    mid=number[start];
    while(i<j)//当i》=j时找到标杆的位置
    {
        for(j;j>i;j--)
        {
            if(number[j]<=mid)
            {
                number[i]=number[j];//从左边往右找 找到一个比mid小的数 将它搬到右边i的位置
                k=j;
                break;
            }
        }

        for(i;i<=j;i++)
        {
            if(number[i]>mid)
            {
                number[j]=number[i];//从右边往左边找 找到一个比mid大的数 将它搬到j的位置;
                k=i;
                break;

            }
        }
    
    
    }
    number[k]=mid;//把mid移动到最后一个空位;
    sort(start,k-1);//进入右子段 进行快速排序
    sort(k+1,end);//进入左子段 进行快速排序


}
int main()
{
    int n;
    while(scanf("%d",&n),n)
    {
        printf("请输入n个数\n");
        memset(number,0,sizeof(number));
        int i;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&number[i]);
        
        }//输入数据
        sort(1,n);
        //进行快排
        printf("排序后结果\n");
        for(i=1;i<=n;i++)
        {
            printf("%d ",number[i]);
        }
        printf("\n");
        

    
    
    }


    return 0;


}

posted @ 2013-10-20 21:38  一只蚊子  阅读(159)  评论(0编辑  收藏  举报