【C++】冒泡排序、插入排序、快速排序

#include<iostream>
using namespace std;
void BubbleSort(int *a,int istart,int len)//冒泡排序
{
    //a为数组,len为数组长度,对a[istart]~a[len-1]进行排序,小浮大沉
    //从后面往前两两比较,小的上浮,直到最顶端a[istart]中存放的是剩余数组中最小的数。
    for(int i=len;i>istart+1;i--)
    {
        if(a[i-2]>a[i-1])
        {
            int temp=a[i-2];
            a[i-2]=a[i-1];
            a[i-1]=temp;
        }
    }
    if(istart<len-1)BubbleSort(a,istart+1,len);
}


void InsertionSort(int *a,int ilast,int len)//插入排序
{
    //取元素a[ilast+1]插入到a[0]~a[ilast]中,从a[ilast]开始往上一个个比较,如果大小顺序不妥,就对调下它们的数值。
    int i=ilast+1;
    int temp=0;
    while (a[i]<a[i-1])
    {
        temp=a[i-1];
        a[i-1]=a[i];
        a[i]=temp;
        i--;
        if(i<1)break;
    }
    if(ilast<len-2)InsertionSort(a,ilast+1,len);
}

void QuickSort(int *a,int istart,int ilast)//快速排序
{    //对数组a中从a[istart]~a[ilast]的所有元素进行排序
    //1.取第一个数a[istart]做基准,则a[istart]就留出了一个空位置,从后往前找,找到最近一个小于基数的数值(a[j])存入前面的空位置a[i]
    //2.从前往后找,找到最近一个大于基数的数值存入a[j],则余出来的空位置又假定为a[i]
    //3.当i超过j(即i>=j时)结束该轮排序
    //4.重复以上步骤
    int BaseNum=a[istart];
    int i=istart,j=ilast;
    int k=0;
    while (1)
    {
        while(a[j]>BaseNum && i<j)j--;
        a[i]=a[j];        
        i++;
        if (i>=j)
        {
            a[j]=BaseNum;
            k=j;
            break;
        }
        while(a[i]<BaseNum && i<j)i++;
        a[j]=a[i];
        if (i>=j)
        {
            a[j]=BaseNum;
            k=j;
            break;
        }    
        j--;
    }
    if(istart<k)QuickSort(a,istart,k);
    if(k+1<ilast)QuickSort(a,k+1,ilast);
}
void main()
{
    int a[]={1,4,8,9,7,2,6,3,5};
    int len=sizeof(a)/sizeof(int);
    //BubbleSort(a,0,len);
    //InsertionSort(a,0,len);
    QuickSort(a,0,len-1);
    for(int i=0;i<len;i++)
    {
        cout<<a[i]<<" ";
    }
    cout<<endl;
}

//注:本程序的快速排序虽然基本实现功能,但编写凌乱,留待以后改进

 

posted @ 2013-12-31 16:13  博园少主  阅读(262)  评论(0编辑  收藏  举报