zoukankan      html  css  js  c++  java
  • 【Sort】多种排序

        这篇文章包含了插入排序,希尔排序,堆排序,归并排序和快速排序,是前几篇文章的集合。

    一共包括三个文件

    sort.h

    sort.cpp

    main.cpp

    1.main.cpp

    1 #include <iostream>
    2 #include "sort.h"
    3 using namespace std;
    4 
    5 int main()
    6 {
    7 \test code
    8     return 0;
    9 }

    2.sort.h

     1 #ifndef SORT_H_
     2 #define SORT_H_
     3 void intersort(int *nums,int n);
     4 void shellsort(int *nums,int n);
     5 void percdown(int *num,int p,int n);
     6 void heapsort(int *nums,int n);
     7 void mergesort(int *nums,int n);
     8 void msort(int *nums,int*tmp,int lp,int rp);
     9 void merge(int *nums,int *tmp,int lp,int rp,int over);
    10 void swap(int &m,int &n);
    11 int mid3(int *nums,int left,int right);
    12 void qs(int*nums,int left,int right);
    13 void quicksort(int *nums,int n);
    14 #endif // SORT_H_

    3.sort.cpp

      1 #include "sort.h"
      2 #include<iostream>
      3 
      4 void intersort(int *nums,int n)
      5 {
      6     int i,j;
      7     int tmp;
      8     for(i=1;i<n;i++)
      9     {
     10         tmp=nums[i];
     11         for(j=i;j>0&&tmp<nums[j-1];j--)
     12             nums[j]=nums[j-1];
     13         nums[j]=tmp;
     14     }
     15 }
     16 
     17 void shellsort(int *nums,int n)
     18 {
     19     int gap,i,j;
     20     int tmp;
     21     for(gap=n/2;gap>0;gap/=2)
     22     {
     23         for(i=gap;i<n;i++)
     24         {
     25             tmp=nums[i];
     26             for(j=i;j>0;j-=gap)
     27                 if(tmp<nums[j-gap])
     28                     nums[j]=nums[j-gap];
     29                 else
     30                     break;
     31             nums[j]=tmp;
     32         }
     33     }
     34 }
     35 
     36 void heapsort(int *nums,int n)
     37 {
     38     int i;
     39     for(i=n/2;i>=0;i--)
     40         percdown(nums,i,n);
     41     for(i=n-1;i>0;i--)
     42     {
     43         nums[0]^=nums[i];
     44         nums[i]^=nums[0];
     45         nums[0]^=nums[i];
     46         percdown(nums,0,i);
     47     }
     48 }
     49 void percdown(int *nums,int p,int n)
     50 {
     51     int tmp;
     52     int child;
     53     for(tmp=nums[p];2*p+1<n;p=child)
     54     {
     55         child=2*p+1;
     56         if(2*p+2!=n&&nums[2*p+2]>nums[child])
     57             child++;
     58         if(nums[child]>tmp)
     59             nums[p]=nums[child];
     60             else
     61                 break;
     62     }
     63     nums[p]=tmp;
     64 
     65 }
     66 
     67 void mergesort(int *nums,int n)
     68 {
     69     int *tmp=new int[n];
     70     if(tmp)
     71     {
     72         msort(nums,tmp,0,n-1);
     73         delete[]tmp;
     74     }
     75 }
     76 void msort(int *nums,int*tmp,int lp,int rp)
     77 {
     78     int center=(lp+rp)/2;
     79     if(lp<rp)
     80     {
     81         msort(nums,tmp,lp,center);
     82         msort(nums,tmp,center+1,rp);
     83         merge(nums,tmp,lp,center+1,rp);
     84     }
     85 }
     86 void merge(int *nums,int *tmp,int lp,int rp,int over)
     87 {
     88     int i=lp,j=rp,p=lp;
     89     while(i<rp&&j<=over)
     90     {
     91         if(nums[i]<nums[j])
     92             tmp[p++]=nums[i++];
     93         else
     94             tmp[p++]=nums[j++];
     95     }
     96     while(i<=rp-1)
     97         tmp[p++]=nums[i++];
     98     while(j<=over)
     99         tmp[p++]=nums[j++];
    100     while(lp<=over)
    101     {
    102         nums[lp]=tmp[lp];
    103         lp++;
    104     }
    105 }
    106 
    107 
    108 void quicksort(int *nums,int n)
    109 {
    110     qs(nums,0,n-1);
    111 }
    112 void qs(int*nums,int left,int right)
    113 {
    114     int pv;
    115     int i,j;
    116     int cutoff=10;
    117     if(left+cutoff<=right)
    118     {
    119         pv=mid3(nums,left,right);
    120         i=left;
    121         j=right-1;
    122         while(1)
    123         {
    124             while(nums[++i]<pv);
    125             while(nums[--j]>pv);
    126             if(i<j)
    127                 swap(nums[i],nums[j]);
    128             else
    129                 break;
    130         }
    131         swap(nums[i],nums[right-1]);
    132         qs(nums,left,i);
    133         qs(nums,i+1,right);
    134     }
    135     else
    136         intersort(nums+left,right-left+1);
    137 }
    138 int mid3(int *nums,int left,int right)
    139 {
    140     int center=(left+right)/2;
    141     if(nums[left]>nums[center])
    142         swap(nums[left],nums[center]);
    143     if(nums[left]>nums[right])
    144         swap(nums[left],nums[right]);
    145     if(nums[center]>nums[right])
    146         swap(nums[center],nums[right]);
    147     swap(nums[center],nums[right-1]);
    148     return nums[right-1];
    149 }
    150 void swap(int &m,int &n)
    151 {
    152     m^=n;
    153     n^=m;
    154     m^=n;
    155 }
  • 相关阅读:
    Codeforces 177G2 Fibonacci Strings KMP 矩阵
    Codeforces Gym100187C Very Spacious Office 贪心 堆
    Codeforces 980F Cactus to Tree 仙人掌 Tarjan 树形dp 单调队列
    AtCoder SoundHound Inc. Programming Contest 2018 E + Graph (soundhound2018_summer_qual_e)
    BZOJ3622 已经没有什么好害怕的了 动态规划 容斥原理 组合数学
    NOIP2016提高组Day1T2 天天爱跑步 树链剖分 LCA 倍增 差分
    Codeforces 555C Case of Chocolate 其他
    NOIP2017提高组Day2T3 列队 洛谷P3960 线段树
    NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp
    NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序
  • 原文地址:https://www.cnblogs.com/fcyworld/p/6175623.html
Copyright © 2011-2022 走看看