快速排序c++实现

//  QickSubQickSort.cpp: 主项目文件。

#include  " stdafx.h "
#include <iostream>
using  namespace std;

void QickSort( int arr[],  int iLength);
int SubQickSort( int arr[],  int iCurentIndex,  int iLength);
void Swap( int& a,  int& b);

int main()
{
     const  int iLength =  10;
     int arr[iLength] = { 3018725496};
     // 快速排序
    QickSort(arr, iLength);
     for( int i =  0; i < iLength; ++i)
    {
        cout << arr[i] <<  " \t ";
    }

    system( " pause ");
     return  0;
}

void QickSort( int arr[],  int iLength)
{
     int iStart =  0, iEnd = iLength -  1;
     int* arrSubQickSorted =  new  int[iLength];  // 已经排好的位置 如果已排好, 对应元素设置为1
    memset(arrSubQickSorted,  0sizeof( int) * iLength);
     while( true)
    {
         bool hasFindStart =  false, hasFindEnd =  false;
         // for循环是找出前端与末端的
         for( int i =  0; i < iLength; ++i)
        {
             if(arrSubQickSorted[i] ==  0)
            {
                 if(hasFindStart ==  false)
                {
                    iStart = i;
                    hasFindStart =  true;
                }
                 else  if(hasFindStart  // 已有前端
                    && ((i +  1 < iLength && arrSubQickSorted[i +  1] ==  1// 末端后一位是1值, 当前位是0值
                    || (i +  1 == iLength)))  // 末端后一位已经到最后了
                {
                    iEnd = i;
                    hasFindEnd =  true;
                     break;
                }
            }
        }
         if(hasFindStart && hasFindEnd)  // 前到前端与后端, 则逼近pivot排序; 如果只有前端之类说明已经排好了
        {
             int iPivotPos = SubQickSort(arr, iStart, iEnd);
            arrSubQickSorted[iPivotPos] =  1;
        }
         else
             break;
    }
    delete []arrSubQickSorted;  // 如果直接删除指针是只删除第一个元素
}

// 以iStart为基础元素, 粗排一次, 返回基准元素所在的位置
int SubQickSort( int arr[],  int iStart,  int iEnd)
{
     // 以第一个元素为基准 小的放他左边, 大的放他右边
    
// 遍历时是向基准元素逼进
     int iPivotPos = iStart;
     for( int i = iEnd; i != iPivotPos;)
    {
         // 如果第i个数据比pivot小并且在pivot的右边, 那么交换数据, 交换下i和pivotPost
        
// 如果第i个数据比pivot大并且在pivot左边, 交换
         if((arr[i] < arr[iPivotPos] && i > iPivotPos) || (arr[i] > arr[iPivotPos] && i < iPivotPos) )
        {
            Swap(arr[i], arr[iPivotPos]);
            Swap(iPivotPos, i);
        }
         if(i == iPivotPos)
             break;
         else  if(i > iPivotPos)
            --i;
         else
            ++i;
    }
     return iPivotPos;
}

void Swap( int& a,  int& b)
{
     int c = a;
    a = b;
    a = c;
}

自己拼接出来的. 可以在博客园里里面搜索快速排序算法, 比我这个要好.

参考:

 

你可能感兴趣的:(快速排序)