zoukankan      html  css  js  c++  java
  • 快速排序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;
    }

    下载

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

    参考:

  • 相关阅读:
    control与delegate的Invode、BeginInvoke (一) jason
    你是否愿意每周最少工作80小时 (转)
    详解ASP.NET的SEO:服务器控件背后故事
    深度解析Windows Phone 7开发
    .NET 4新特性:表、SEO及可扩展输出缓存
    VS2010中Parallel类实现并行计算
    iPhone破解软件定制版blackra1n 提供下载
    .NET 4中废弃的特性
    Windows Server 2008 R2上安装WSUS 3.0 SP2
    关于浮动
  • 原文地址:https://www.cnblogs.com/barrysgy/p/2352603.html
Copyright © 2011-2022 走看看