sortAlgorithms

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;


//数的交换
void swap( int* _va, int* _vb )
{
     if( *_va==*_vb )
     {
          return;
     }
     *_va = *_va + *_vb;
     *_vb = *_va - *_vb;
     *_va = *_va - *_vb;
}

//寻找数组最大值
int findMax( int *arr, int len )
{
     int max = arr[0];
     for( int i = 1; i != len; ++i )
     {
          if( arr[i]>max)
          {
               max = arr[i];
          }
     }
     return max;
}
//寻找第二大数
int findSecondMax( int *arr, int len )
{
     int max = arr[0];
     int smax = arr[1];
     for( int i = 1; i != len; ++i )
     {
          if( arr[i]>max)
          {
               smax = max;
               max = arr[i];
          }else if( arr[i] > smax )
          {
               smax = arr[i];
          }
     }
     return smax;
}
//逆置数组
void arrayReverse( int* arr, int len )
{
     int i = 0, j= len-1;
     while( i < j )
     {
          swap( arr+i, arr+j );
          ++i;
          --j;
     }
}
//循环右移k位
//方法一
void rightShift( int* arr, int len, int k )
{
     for(int i = 0; i != k; ++i )
     {
          int tmp = arr[ len -1 ];
          for( int j = len-1; j != 0; --j )
          {
               arr[j] = arr[j-1];
          }
          arr[0] = tmp;
     }
}
//方法二
void rightShift2( int* arr, int len, int k )
{
     arrayReverse( arr, k);
     arrayReverse( arr, len-k);
     arrayReverse( arr, len );
}

//冒泡排序
void bubbleSortZc( int* arr, int len )
{
     for (int i = 0;i<len;++i)
     {
          int change = 1;
          for (int j = 0;j<len - i-1;++j)
          {
               if (arr[j]>arr[j+1])
               {
                    swap(arr+j,arr+j+1);
                    change = 0;
               }
          }
          if (change) break;
     }
}
void bubbleSort( int* arr, int len )
{
     for( int i = 0; i != len-1; ++i )
     {
          for( int j = i+1; j != len; ++j )
          {
               if( arr[j] < arr[i] )
               {
                    swap( arr+i, arr+j );
               }
          }
     }
}

//选择排序
void selectSort( int* arr, int len )
{
     for( int i = 0; i != len; ++i )
     {
          int sIndex = i;
          for( int j = i+1; j != len; ++j )
          {
               if( arr[j] < arr[sIndex] )
               {
                    sIndex = j;
               }
          }
          if( sIndex != i )
          {
               //交换
               swap( arr+sIndex, arr+i );
          }
     }
}
//插入排序
void insertSort( int* arr, int len )
{
     for( int i = 1; i != len; ++i )
     {
          int tmp = arr[ i ];
          //线性右移腾出插入位置
          int j = i-1;
          for( ; arr[j]>tmp; --j )
          {
               arr[j+1] = arr[j];
          }
          arr[j+1] = tmp;
     }
}


//快速排序
int partition(int *A,int left,int right)
{
     int pivot = A[left];
     while (left<right)
     {
          while (left<right && A[right]>=pivot) right--;
          A[left] = A[right];
          while (left<right && A[left]<=pivot) left++;
          A[right] = A[left];         
     }
     A[left] = pivot;
     return left;
}

void quickSort2(int *A,int left,int right)
{
     if (left<right)
     {
          int mid = partition(A,left,right);
          quickSort2(A,left,mid-1);
          quickSort2(A,mid+1,right);
     }
    
}


void quikSort( int* arr, int left, int right )
{
     int mid = (left+ right)/2;
     int _lpos = left;
     int _rpos = right;
     do {
          while( arr[ _lpos ] < arr[mid] ) ++_lpos;
          while( arr[ _rpos ] > arr[mid] )  --_rpos;
          if( _lpos <= _rpos )
          {
               swap( arr+_lpos, arr+_rpos );
               ++_lpos;
               --_rpos;
          }
     }while( _lpos <= _rpos );
     if( left < _rpos )
     {
          quikSort( arr, left, _rpos );
     }
     if( right > _lpos )
     {
          quikSort( arr, _lpos, right );
     }
}

//大顶堆向下调整操作
void heapSiftdown( int* arr, int len , int pos )
{
     if( 2*pos+1 >= len )
     {
          return;
     }
     bool flag = false;
     while( 2*pos+1<len && !flag )
     {
          //要调整位置的左子结点,这时候要调整的位置变成(pos-1)/2
          pos = pos*2+1;
          //与左右子节点较大者交换
          if( pos+1 < len && arr[ pos ]<arr[ pos+1 ] )
          {
               ++pos;
          }
          if( arr[ (pos-1)/2 ] < arr[ pos ] )
          {
               swap( arr+(pos-1)/2, arr+pos);
          }else{
               flag = true;//左右子节点都比本结点小,调整结束
          }
     }
}
//堆排序
void heapSort( int* arr, int len )
{
     //建堆
     for( int i = len/2-1; i>=0; --i )
     {
          heapSiftdown( arr, len, i );
     }
     //排序
     for( int i = len-1; i != 0; --i )
     {
          swap( arr, arr+i );
          heapSiftdown( arr, i, 0);
     }
}

//打印数组
void printArray( int* arr, int len )
{
     for( int i = 0; i != len-1; ++i )
     {
          cout<<arr[i]<<" ";
     }
     cout<<arr[ len-1 ]<<endl;
}

//随机打乱数组,用于测试
void my_shuffer( int* arr, int len )
{
     for( int i = 0; i != len; ++i )
     {
          int j = i + rand()%(len-i);
          if( i!=j )
          {
               swap( arr+i, arr+j );
          }

     }
}

int main( )
{
     int data[1024];
     int len;
     while( cin>>len&&len!=0 )
     {
          for( int i = 0; i != len; ++i )
          {
               cin>>data[i];
          }
          cout<<"Max:"<<findMax( data, len )<<endl;
          cout<<"Second Max:"<<findSecondMax( data, len )<<endl;
          //逆置数组
         arrayReverse( data, len );
          cout<<"Reverse the Array:";
          printArray( data, len );
          //循环右移0到len位
          for( int i = 0; i <= len; ++i )
          {
               rightShift( data, len, i);
               cout<<"Right Shift "<<i<<" position(s):";
               printArray( data, len );
          }
          //循环右移0到len位
          for( int i = 0; i <= len; ++i )
          {
               rightShift2( data, len, i);
               cout<<"Right Shift "<<i<<" position(s):";
               printArray( data, len );
          }
          //冒泡排序
          bubbleSort( data, len );
          cout<<"After select sort:";
          printArray( data, len );

          //随机化数组
         srand( unsigned( time(NULL) ) );
          my_shuffer( data, len );
          cout<<"Shuffer the Array:";
          printArray( data, len );

          //插入排序
          insertSort( data, len );
          cout<<"After select sort:";
          printArray( data, len );

          //随机化数组
         my_shuffer( data, len );
          cout<<"Shuffer the Array:";
          printArray( data, len );

          //选择排序
          selectSort( data, len );
          cout<<"After select sort:";
          printArray( data, len );

          //随机化数组
         my_shuffer( data, len );
          cout<<"Shuffer the Array:";
          printArray( data, len );
          //快排
          quikSort( data, 0, len-1 );
          cout<<"After quick sort:";
          printArray( data, len );
         
          //随机化数组
         my_shuffer( data, len );
          cout<<"Shuffer the Array:";
          printArray( data, len );
         
          //堆排序
          heapSort( data, len );
          cout<<"After heap sort:";
          printArray( data, len );
     }
     return 0;
}

原文地址:https://www.cnblogs.com/zcwsmile/p/4027819.html