zoukankan      html  css  js  c++  java
  • 排序算法

     

    一、直接插入排序

    在要排序的一组数中,假设前面(n-1)个数已经有序,现在要把第n个数插到前面的有序数中,

    使得这n个数也是有序的。如此反复循环,直到全部有序。

     1 /*void swap(int arr[],int i,int j)
     2 {
     3     int temp = arr[i];
     4     arr[i] = arr[j];
     5     arr[j] = temp;
     6 }
     7 
     8 void show(int arr[],int len)
     9 {
    10     for(int i=0;i<len;i++)
    11     {
    12         cout<<arr[i]<<" ";
    13     }
    14     cout<<endl;
    15 }
    16 */
    17 //插入排序
    18 void InsertSort(int arr[],int len)
    19 {
    20     if(arr == NULL || len < 2)
    21         return;
    22     int j = 0;
    23     int i = 0;
    24     int temp = 0;
    25     for(i=1; i<len;i++)
    26     {
    27         temp = arr[i];
    28         for(j=i-1;j>=0&&temp<arr[j];j--)
    29         {
    30             arr[j+1] = arr[j];
    31         }
    32         arr[j+1] = temp;
    33     }
    34 }

    二、shell排序

    先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d。

    对每组中全部元素进行直接插入排序,然后再用一个较小的增量对它进行分组,在每组中

    再进行直接插入排序。

    当增量减到1,进行直接插入排序后,排序完成。

     1 void ShellSort(int arr[],int len)
     2 {
     3     int j = 0;
     4     int temp = 0;
     5     for(int dk=len/2;dk>0;dk /= 2)
     6     {
     7         for(int i=dk;i<len;i++)
     8         {
     9             temp = arr[i];
    10             for(j=i-dk;j>=0 && arr[j]>arr[j+dk];j -= dk)
    11             {
    12                 arr[j+dk] = arr[j];
    13             }
    14             arr[j+dk] = temp;
    15         }
    16     }
    17 }

    三、直接选择排序

    在要排序的一组数中,选出最小的一个数与第一个位置的数交换,然后在剩下的数当中

    再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止

     1  void SelectSort(int arr[],int len)
     2  {
     3      if(arr == NULL || len < 2)
     4          return;
     5      for(int i=0;i<len-1;i++)
     6      {
     7          int minIndex = i;
     8          for(int j=i+1;j<len;j++)
     9          {
    10             minIndex = arr[j]<arr[minIndex] ? j : minIndex;
    11          }
    12             swap(arr,i,minIndex);
    13       }
    14 }

    四、堆排序

    堆排序是一种树形选择排序,是对直接选择排序的优化。

    void HeapAdjust(int* arr,int begin,int end)
    {
        int i = begin;
        int j = 2*i+1;
        int tmp = arr[i];
        
        while(j <= end)
        {
            if(j < end && arr[j+1] > arr[j])
            {
                j++;
            }
            if(tmp > arr[j])
            {
                break;
            }
            arr[i] = arr[j];
            i = j;
            j = 2*i+1;
        }
        arr[i] = tmp;
    }
    void HeapSort(int arr[],int len)
    {
        int tmp;
        int i;
        
        for(i = (len-2)/2; i>=0; i--)
        {
            HeapAdjust(arr,i,len-1);
        }
        
        for(int k = len-1; k>0; k--)
        {
            tmp = arr[0];
            arr[0] = arr[k];
            arr[k] = tmp;
            HeapAdjust(arr,0,k-1);
        }
    }

    五、冒泡排序

    1 void BubbleSort(int arr[],int len)
    2 {
    3     for(int i=0;i<len-1;i++)
    4         for(int j=0;j<len-i-1;j++)
    5         {
    6             if(arr[j]>arr[j+1])
    7                 swap(arr,j,j+1);
    8         }
    9 }

    六、快排

     1 int Parition(int* arr,int low,int high)
     2 {
     3     int tmp = arr[low];
     4     
     5     while (low < high)
     6     {
     7         while(low < high && arr[high] >= tmp)
     8             high--;
     9         arr[low] = arr[high];
    10         while(low < high && arr[low] <= tmp)
    11             low++;
    12         arr[high] = arr[low];
    13     }
    14     arr[low] = tmp;
    15     return low;
    16 }
    17 
    18 void QuickSort(int* arr,int low,int high)
    19 {
    20     if (low < high)
    21     {
    22         int boundkey = Parition(arr,low,high);
    23         QuickSort(arr,low,boundkey-1);
    24         QuickSort(arr,boundkey+1,high);
    25     }
    26     
    27 }
    28 void Quick(int* arr,int len)
    29 {
    30     QuickSort(arr,0,len-1);
    31 }

    七、归并排序

    void SortProcess(int arr[],int left,int right,int help[]);
    void Merge(int arr[],int left,int mid,int right,int help[]);
    void MergeSort(int arr[],int len)
    {
        if(arr == NULL || len < 2)
            return;
        int *help = new int[len];
        SortProcess(arr,0,len-1,help);
        delete[] help;
    }
    void SortProcess(int arr[],int left,int right,int help[])
    {
        if(left==right)
            return;
        int mid = (left+right)/2;
        SortProcess(arr,0,mid,help);
        SortProcess(arr,mid+1,right,help);
        Merge(arr,left,mid,right,help);
    }
    void Merge(int arr[],int left,int mid,int right,int help[])
    {
        int help_len = right-left+1;
        int i = 0;
        int p1 = left;
        int p2 = mid+1;
        while(p1<=mid && p2<=right)
        {
            help[i++] = arr[p1]<arr[p2] ? arr[p1++] : arr[p2++];
        }
        while(p1<=mid)
        {
            help[i++] = arr[p1++];
        }
        while(p2<=right)
        {
            help[i++] = arr[p2++];
        }
        for(i=0;i<help_len;i++)
        {
            arr[left+i] = help[i];
        }
    }

     八、基数排序

    int Find_fin_num(int num,int fin)
    {
        return num / (int)pow(10.0,fin)  % 10;
    }
    
    void RadixSort(int* arr,int len,int fin)
    {
        int bucket[10][N] = {0};
        int count[10] = {0};
    
        for (int i=0; i<len; i++)
        {
            int fin_num = Find_fin_num(arr[i],fin);
            bucket[fin_num][count[fin_num]] = arr[i];
            count[fin_num]++;
        }
    
        int Index = 0;
        for (int i=0; i<10; i++)
        {
            for (int j=0; j<count[i]; j++)
            {
                arr[Index++] = bucket[i][j];
            }
        }
    }
    int FindMaxPos(int* arr,int len)
    {
        int max = arr[0];
        int count = 0;
        for (int i=0; i<len; i++)
        {
            if (arr[i] > max)
            {
                max = arr[i];
            }
        }
    
        while(max != 0)
        {
            max = max/10;
            count++;
        }
        return count;
    }
    
    void radix(int* arr,int len)
    {
        int max_pos = FindMaxPos(arr,len);
        for (int i=0; i < max_pos; i++)
        {
            RadixSort(arr,len,i);
        }
    }
  • 相关阅读:
    CDQ分治
    [noip模拟赛2017.7.15]
    [noip模拟赛2017.7.11]
    [noip模拟赛2017.7.10]
    [noip模拟赛2017.7.7]
    [noip模拟赛2017.7.6]
    [noip模拟赛2017.7.4]
    回文检测
    mapreduce引用第三方jar
    Spark安装和配置
  • 原文地址:https://www.cnblogs.com/lulu1997/p/9870951.html
Copyright © 2011-2022 走看看