白话经典算法系列之一 冒泡排序的三种实现(转)

#include
using namespace std;

//交换两个数,这里用到了引用
void Swap(int &a, int &b)
{
    int temp;

    temp = a;
    a = b;
    b = temp;

    return ;
}


void BubbleSort1(int a[], int len)
{
    int i,j;
    for (i =0 ; i < len; i++)
    {
        for(j = 1; j < len - i; j++)                   // 这层的循环,注意 len - i
        {
            if (a[j-1] > a[j])
            {
                Swap(a[ j-1], a[j]);         
            }

        }
    }
    return ;
}


/* 优化这个版本
 * 设置一个标志flag, 如果这一趟(某一轮循环)发生了交换,设置为true;如果有一趟(一轮)没有发生交换
 * 说明排序已经排好,设置为false
*/
void BubbleSort2(int a[], int len)
{
    int i, j, k;
    bool flag;

    k = len;                                                  //控制外层循环
    flag = true;                                            //初始时,需要排序
    while(flag)
    {
        flag = false;                                     //设置flag 不需要排序,如果循环里面把flag置成true了,说明需要操作
        for (j =1 ; j < k; j++)
        {
            if (a[j - 1] > a[j])
            {
                Swap(a[ j-1], a[j]);                       //交换数值
                flag =  true;                               //需要排序操作

            }
        }
       k--;
    }   
    return ;
}

/*如果有10个数的数组,仅前面5个数无序,后面5个已经排序好了且都大于前面的5个数
 * 在第一趟遍历之后,后面发生的交换的位置必定小于5,且这个位置之后的数据必定已经排好序了
 *记录下这个位置,第二次只要从数组头部遍历到这个位置就行
*/
void BubbleSort3(int a[], int len)
{
    int i, j, k;
    int flag;

    flag = len;                                                //控制外层循环
    while(flag >0)
    {
        k = flag ;      
        flag = 0;
        for (j =1 ; j < k; j++)                         //第一轮循环结束了之后,知道flag后面的数已经拍好了
        {
            if (a[j - 1] > a[j])
            {
                Swap(a[ j-1], a[j]);                       //交换数值
                flag = j;                                    //需要排序操作

            }
        }
    }   
    return ;
}

int main()
{
    int i;
    int N =10;                                                    //数组个数
    int s[10] = {72,6,57,88,60,42,83,73,48,85};         //初始化
    //int s[10] = {48,6,57,60,42,72,73,83,85,88};         //初始化
    for(i = 0;  i < 9; i++)
        cout<< s[i] <<" ";
    cout<//quick_sort(s, 0, 10-1);                                     //快速排序
    //BubbleSort1(s,N);
    //BubbleSort2(s,N);
    BubbleSort3(s,N);
    //输出排序后的数组
    for(i = 0;  i < 9; i++)
        cout<< s[i] <<" ";

    return 0;

}

你可能感兴趣的:(笔试题)