悉野小楼

导航

快速排序c++实现

// QickSort.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;
    b = c;
}

 

下载

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

参考:

 

【轻松学排序算法】眼睛直观感受几种常用排序算法

posted on 2012-02-15 14:36  悉野  阅读(246)  评论(0编辑  收藏  举报