【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 }
时间: 2024-10-20 19:41:18

【Sort】多种排序的相关文章

使用 redis (sort set排序集合类型操作)

sort set排序集合类型 释义: sort set 是 string 类型的集合 sort set 的每个元素 都会关联一个 权 通过 权值 可以有序的获取集合中的元素 应用场合: 获取热门帖子(回复量)信息: select * from message order by backnum desc limit 5; // 利用 sort set 实现最热门的前 5 贴信息 帖子id            回复量(万条) 11                102        12     

Linux Shell sort 指定排序第几列

ip.txt 里存储着ip信息 统计排序后取前10条 awk '{cnt[$1]++} END{for (ip in cnt) print ip":"cnt[ip]}' ip.txt | sort -k 2 -rn -t":" | head -n 10 awk '{cnt[$1]++} END{for (ip in cnt) print cnt[ip],ip}' ip.txt | sort -rn | head -n 10 sort -k  根据第几列排序  -n

counting sort 计数排序

//counting sort 计数排序 //参考算法导论8.2节 #include<cstdio> #include<cstring> #include<algorithm> #include<cassert> using namespace std; const int k=5; const int n=7; int a[n]={5, 5, 1, 2 , 5, 4, 1}; int b[n]; int c[k+1]; int main() { int m

Uva-------(11462) Age Sort(计数排序)

B Age Sort Input: Standard Input Output: Standard Output   You are given the ages (in years) of all people of a country with at least 1 year of age. You know that no individual in that country lives for 100 or more years. Now, you are given a very si

多种排序算法的比较

1.冒泡排序和选择排序 为什么把冒泡排序和选择排序放在一块儿呢?因为我发现他们两个有点像. 冒泡排序是不停的把最大的元素换到数组的最右端. 而选择排序是把最小的元素换到最左端. 看到这儿,你是不是觉得冒泡和选择好像没啥区别啊,把最大换成最小就成了一种新的算法?那我也来一个? 其实,无论换最大还是最小,都无关紧要,就算冒泡变成换最小的元素换到数组的最左端,那它也叫冒泡排序的. 冒泡排序的描述:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进

sort counter 排序

1 2 --------------------对象用Counter------------------------------------------------------------- 3 4 dc={"james":4,"kim":3,"marry":5,"bill":6} 5 from collections import Counter 6 counts=Counter(dc) 7 counts 8 >>

Shell Sort(希尔排序)

近日学习了Shell Sort,也就是希尔排序,也称递减增量排序算法.在1959年由DL.Shell提出于1959年提出,由此得名. 此版本算法是在插入排序(Insertion Sort)基础上,将数组分成了h份(gap).也就是在数组中每隔h个数取出一个数,为一个子数组.先在子数组上进行排序,然后不断减小h的大小,直到h == 1 时,也就是完全变成插入排序的时候,排序完成. 算法复杂度取决于h(步长/步进)的选择,在最差的时候,也就是h == 1的时候,希尔排序就变成了插入排序,复杂度为O(

Spring Data JPA使用Sort进行排序(Using Sort)(转)

通过上一节的学习,我们知道了如何用@Query注解来实现灵活的查询.在上一节的示例中,我也尝试给出简单的排序,通过JPQL语句以及原生SQL来实现的.这样的实现,虽然在一定程度上可以应用,但是灵活度不够,因此结合@Query注解,我们可以使用Sort来对结果进行排序. 1.在CustomerRepository内添加方法 /** * 一个参数,匹配两个字段 * @param name2 * @param sort 指定排序的参数,可以根据需要进行调整 * @return * 这里Param的值和

erlang下lists模块sort(排序)方法源码解析(二)

上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel模块,因为我们先前主要分析的split_1_*对应的是rmergel,我们先从rmergel查看,如下 ....................................................... split_1(X, Y, [], R, Rs) -> rmergel([[Y, X

HashMap与HashCode有关,用Sort对象排序

遍历Map,使用keySet()可以返回set值,用keySet()得到key值,使用迭代器遍历,然后使用put()得到value值. 上面这个算法的关键语句: Set s=m.keySet(); Interator it=new interator(); Object key=it.next(); Object value=m.get(key); 注意:HashMap与HashCode有关,用Sort对象排序. 如果在HashMap中有key值重复,那么后面一条记录的value覆盖前面一条记录