成功源于积累----波爸

思想决定高度,行动决定成败!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

1、快速排序

平均复杂度是nlogn

 

#include<iostream>
#include<stdlib.h>
#include<time.h>

using namespace std;

//化分区间,找到最后元素的排序位置。并返回分隔的点(即最后一数据排序的位置)。
//划分的区间是[nBegin, nEnd). pData是保存数据的指针
int Partition(int *pData, int nBegin, int nEnd)
{
 int i = nBegin + rand()%(nEnd - nBegin);
 int x = pData[i];
 pData[i] = pData[nBegin];
 pData[nBegin] = x;
 --nEnd;

 while(nBegin < nEnd)
 {
  //从后向前,找到比X小的元素位置
  while(pData[nEnd] > x)
  {
   --nEnd;
  }

  if(nBegin < nEnd)
  {
   pData[nBegin] = pData[nEnd];
   pData[nEnd] = x;  //这里是为了做一个哨兵,防止小区域增加时越界。
   ++nBegin;
  }

  //小的区域增加,找到一个不比x小的元素。
  while(pData[nBegin] < x)
  {
   ++nBegin;
  }

  //把不比x小的元素存放在大的区域内。nEnd刚好预留了此位置。
  if(nBegin < nEnd)
  {
   pData[nEnd] = pData[nBegin];
   --nEnd;
  }
 }

 pData[nBegin] = x; //这里一定要赋值,不然如果是nEnd退出循环,他是保存着以前的大值,会出错。
 return nBegin; //返回nD的位置,就是分割的位置
}

//排序的递归调用
int QuickSortRecursion(int *pData, int nBegin, int nEnd)
{
 if(nBegin >= nEnd - 1)
 {
  return 1;
 }

 //这里因为分割的时候,分割点处的数据就是排序中他的位置
 //也就是说他的左边的数据都小于等于他,他右边的数据都大于他
 //所以他不在递归调用的数据中
 int i = Partition(pData, nBegin, nEnd);

 QuickSortRecursion(pData, nBegin, i);
 QuickSortRecursion(pData, i + 1, nEnd);
 return 1;
}

//快速排序
int QuickSort(int* pData, int nLen)
{
    srand((unsigned int)time(NULL));
    //递归调用,快速排序。
    QuickSortRecursion(pData, 0, nLen);
    return 1;
}

int main()
{
 int nData[10] = {2,6,3,4,1,5,7,8,10,9};        //测试数据
    QuickSort(nData, 10);
    for (int i = 0; i < 10; ++i)
    {
        cout << nData[i] << "  ";
    }
 cout << endl;
 system("pause");
 return 0;
}

 

 

2、堆排序

 

#include<iostream>
#include<stdlib.h>
#include<time.h>

using namespace std;

inline void Swap(int &a, int &b)
{
 if(a != b)
 {
  a^=b;
  b^=a;
  a^=b;
 }
}

int Heapify(int *npData, int nPos, int nLen)
{
 int nMax = -1; //暂存最大值
 int nChild = nPos * 2; //他的左孩子位置

 while(nChild <= nLen)
 {
  nMax = npData[nPos];
  if(nMax < npData[nChild])
  {
   nMax = npData[nChild];
  }

  if(nMax != npData[nPos])
  {
   Swap(npData[nPos], npData[nChild]);
   nPos = nChild;
   nChild *= 2;
  }
  else
  {
   break;
  }
 }
 return 1;
}

//建立一个堆
int BuildHeap(int* npData, int nLen)
{
    //从nLen / 2最后一个有叶子的数据开始,逐一的插入堆,并维持堆得平衡。
    //因为堆是一个完全二叉树,所以nlen/2+1- nLen之间肯定都是叶子。
    //叶子还判断什么呢。只有一个数据,肯定满足堆得性质咯。
    for (int i = nLen / 2; i >= 1; --i)
    {
        Heapify(npData, i, nLen);
    }

    return 1;
}

//堆排序
int HeapSort(int* npData, int nLen)
{
    BuildHeap(npData, nLen);        //建立一个堆。

    while(nLen >= 1)                //逐一交和第一个元素交换数据到最后
    {                                //完成排序
        Swap(npData[nLen], npData[1]);
        --nLen;
        Heapify(npData, 1, nLen);//交换之后一定要维持一下堆得性质。
    }                            //不然小的成第一个元素,就不是堆了。

    return 1;
}

 

int main()
{
 int nData[11] = {0,9,8,7,6,5,4,3,2,1,0};    //测试数据,下标从1开始哦。
    HeapSort(nData, 10);                        //堆排序

    for (int i = 1; i <= 10; ++i)                //输出排序结果。
    {
       cout << nData[i] << "  ";
    }
 cout << endl;
 system("pause");
 return 0;
}

 

 

3、冒泡排序

 

#include<iostream>

using namespace std;

void bubbleSort(int *pData, int len)
{
 bool flag = false;
 int temp;
 for(int i = len - 1; i > 0; i--)
 {
  flag = false;
  for(int j = 0; j < i; j++)
  {
   if(pData[j] > pData[j + 1])
   {
    temp = pData[j];
    pData[j] = pData[j + 1];
    pData[j + 1] = temp;
    flag = true;
   }
  }
  if(flag == false)
  {
   break;
  }
 }

 for(int j = 0; j < len; j++)
 {
  cout << pData[j] << " ";
 }
 cout << endl;
}

int main()
{
 int pData[] = {0, 4, 2, 6, -3, 5, 3, 9, 7, 8};
 bubbleSort(pData, 10);
 system("pause");
 return 0;
}

 

4、插入排序

 

#include<iostream>

using namespace std;

void insertSort(int *pData, int len)
{
 int temp;
 for(int i = 0; i < len; i++)
 {
  for(int j = i - 1; j >= 0; j--)
  {
   if(pData[j + 1] < pData[j])
   {
    temp = pData[j + 1];
    pData[j + 1] = pData[j];
    pData[j] = temp;
   }
  }
 }

 for(int j = 0; j < len; j++)
 {
  cout << pData[j] << " ";
 }
 cout << endl;
}

int main()
{
 int pData[] = {0, 4, 2, 6, -3, 5, 3, 9, 7, 8};
 insertSort(pData, 10);
 system("pause");
 return 0;
}

 

4、shell排序

 

#include<iostream>

using namespace std;

void swap(int *a, int *b)
{
     int temp = *a;
     *a = *b;
     *b = temp;
}

void shell(int *p, int n)
{
     int gap = n/2;
     int i,j;
     for(; gap > 0; gap = gap/2)
     {
           for(i = gap; i <= n - 1; i++) //´Ógap¿ªÊ¼ÎªËùÔÚµÄÿ¸ö×é½øÐвåÈëÅÅÐò£¬i=gapÊǸÃ×éµÄµÚ¶þ¸öÔªËØ
           {
                 j = i;
                 if(*(p+j) < *(p+j-gap))
                 {
                      while(j >= gap && *(p + j - gap))
                      {
                              swap(p+j, p+j-gap);
                              j = j-gap;
                      }
                 }
           }
     }
}

int main()
{
    int a[]= {5,4,3,21,1,100,93,1,3,2,4};
    shell(a, 11);
    for(int k = 0; k < 10; k++)
     {
             cout << *(a+k) << " ";
     }
     cout << endl;
    system("pause");
    return 0;
}

 

posted on 2012-06-24 23:14  沙场醉客  阅读(247)  评论(0编辑  收藏  举报