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 }
  • 相关阅读:
    C#中两个日期类型的变量如何进行比较
    Ajax基本原理讲解 (引用别人文章)
    Ajax程序设计入门
    ASP.NET中如何调用存储过程
    删除SAM文件真的能够消除XP系统管理员的密码吗?
    用XMLHttpRequest和struts实现AJAX(译)
    关于邮件系统域名(DNS)设置的小常识
    输出各种二进制流的格式
    WPF 3D编程介绍
    WPF 3D学习笔记
  • 原文地址:https://www.cnblogs.com/fcyworld/p/6175623.html
Copyright © 2011-2022 走看看