经典算法 | 使用C++实现常用的六种排序方法

#include<iostream>

using namespace std ;

 

//num[0]作为哨兵,不使用,数组从1开始

 

//插入排序

void InsertSort(int num[], int n)

{

      int j;

      for(int i = 2 ; i <= n ; i++)

      {

            if(num[i] < num[i - 1])

            {

                  num[0] = num[i];

                  for(j = i - 1 ; num[j] > num[0] ; j--)

                  {

                       num[j + 1] = num[j];

                  }

                  num[j + 1] = num[0];

            }

      }

}

//冒泡排序

void BubbleSort(int num[], int n)

{

      bool flags;

      for(int i = n ; i > 1 ; i--)

      {   

            flags = false;

            for(int j = 1 ; j < i ; j++)

            {

                  if(num[j] > num[j + 1])

                  {

                       swap(num[j], num[j + 1]);

                       flags = true;

                  }

            }

            if(!flags) return;

      }

}

//希尔排序

void ShellSort(int num[], int n)

{

      int j;

      for(int len = n / 2 ; len >= 1 ; len /= 2)

      {

            for(int st = len + 1 ; st <= n ; st += len)

            {

                  if(num[st] < num[st - len])

                  {   

                       num[0] = num[st];

                      

                       for(j = st - len ; j >= 1 && num[j] > num[0] ; j -= len)

                       {

                             num[j + len] = num[j];

                       }

                       num[j + len] = num[0];

                  }

            }

           

      }

}

 

//快速排序

int Partion(int num[], int s, int e)

{   

      int c = s;

      s ++;

      while(true)

      {

            while(e >= s && num[c] > num[s]) s++;

            while(e >= s && num[c] < num[e]) e--;

            if(e < s) break;

            swap(num[s++], num[e--]);

      }

      swap(num[c], num[e]);

      return e;

}

void QuickSort(int num[], int s, int e)

{

       if(e <= s) return;

       int mid =   Partion(num, s, e);

       QuickSort(num, s, mid - 1);

       QuickSort(num, mid + 1, e);

     

}

 

//堆排序

void CereatHeap(int num[], int n)

{

      int tmp =0;

      int p = 0;

      for(int i= n/2;i>=1;i--)

      {

            p = i;

            while(p * 2 <= n)

            {

                  tmp =  p * 2;

                  if(tmp + 1 <= n && num[tmp + 1] > num[tmp]) tmp += 1;

                  if(num[tmp] > num[p])

                  {

                       swap(num[p], num[tmp]);

                       p = tmp;

                  }

                  else

                  {

                       break;

                  }

            }

      }

}

void adjustHeap(int num[], int n)

{

      int p = 1;

      int tmp = 0;

      while(p * 2 <= n)

      {

            tmp = p * 2;

            if(tmp + 1 <= n && num[tmp + 1] > num[tmp]) tmp += 1;

            if(num[tmp] > num[p])

                  {

                       swap(num[p], num[tmp]);

                       p = tmp;

                  }

                  else

                  {

                       break;

                  }

      }

}

void HeapSort(int num[], int n)

{

      for(int i=n;i>=2;i--)

      {

            swap(num[1], num[i]);

            adjustHeap(num, i - 1);

      }

}

 

//归并排序

int helpNum[1000];

void merge(int num[], int low,int mid, int high)

{

      for(int i = low;i<=high;i++)

      helpNum[i] = num[i];

      int k=low;

      int i =low;

      int j = mid + 1;

      for( ;i<=mid&&j<=high;)

      {

            if(helpNum[i] < helpNum[j])

            {

                  num[k++]= helpNum[i++];

            }

            else

            {

                  num[k++]= helpNum[j++];

            }

      }

      while(i <= mid) num[k++] = helpNum[i++];

      while(j <= high) num[k++] = helpNum[j++];

}

void MergerSort(int num[], int low, int high)

{

      if(low < high)

      {

            int mid = (low + high) / 2;

            MergerSort(num, low, mid);

            MergerSort(num, mid + 1, high);

            merge(num, low, mid, high);

      }

}

 

//归并排序

 

int main()

{

      int num[] = {

            -10000, 1, 4, 3, 2, 1, 5

      };

      int n =6;

      InsertSort(num, n);//插入排序

      BubbleSort(num, n);//冒泡排序

      ShellSort(num, n);//希尔排序

      QuickSort(num, 1, n);//快速排序

      HeapSort(num, n);//堆排序

      MergerSort(num, 1, n);//归并排序

     

      return 0 ;

}

猜你喜欢

转载自blog.csdn.net/u012737193/article/details/82261359