哈希排序与归并排序

哈希排序:

==该方法实质上是一种分组插入方法
比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比[2] 较就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。
一般的初次取序列的一半为增量,以后每次减半,直到增量为1。
给定实例的shell排序的排序过程
假设待排序文件有10个记录,其关键字分别是:
49,38,65,97,76,13,27,49,55,04。
增量序列的取值依次为:
5,3,1==

代码实现

```
#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN=101;
int num[MAXN];
void shell_sort(int *data,int len)
{
if(len<1||data==NULL){
return ;
}
// for( int div=len/2; div>=1; div=div/2)//定量div
// {
// for( int i=0; i<=div; i++ ){//分成div组
// for(int j=i;j<len-div;j+=div) //对每组进行插入排序
// for(int k=j;k<len;k+=div)
// if(data[j]>data[k])
// swap(*(data+j),*(data+k)); //交换两个数的值
// }
// }
int div=len/2;
do{
for( int i=0; i<=div; i++ ){//分成div组
for( int j=i;j<len-div; j+=div ){//对每组进行div排序
for( int k=j; k<len; k+=div ){
if(data[j]>data[k]){
swap(*(data+j),*(data+k));
}
}
}
}
div=div/2;
}while(div>=1);
}
int main()
{
int n;
scanf("%d",&n);
for( int i=0; i<n; i++ ){
scanf("%d",&num[i]);
}
shell_sort(num,n);
for( int i=0; i<n; i++ )
{
printf("%d%c",num[i],i==n-1?' ':' ');
}
return 0;
}

```


归并排序

==归并排序:
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并==

```
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1010;
int num[MAXN];


void merge(int a[], int first, int mid, int last)//归并有序代码段
{
int i=first,j=mid+1,m=mid,n=last;
int l=m-i;
int k=0;
int temp[MAXN];
while(i<=m&&j<=n){
if(a[i]<a[j]){
temp[k++]=a[i++];
}
else{
temp[k++]=a[j++];
}
}
while(i<=m){
temp[k++]=a[i++];
}
while(j<=m){
temp[k++]=a[j++];
}
for( int i=0; i<k; i++ ){
a[first+i]=temp[i];
}
}
void mergesort(int a[], int first, int last)//分段有序代码段
{
if(first<last){
int mid=(first+last)/2;
mergesort(a,first,mid);//左边有序
mergesort(a,mid+1,last);//右边有序
merge(a,first,mid,last);//合并有序
}
}

int main()
{
int n;
scanf("%d",&n);
for( int i=1; i<=n; i++ ){
scanf("%d",&num[i]);
}
mergesort(num,1,n);
for( int i=1; i<=n; i++ ){
printf("%d%c",num[i],i==n?' ':' ');
}

return 0;
}

```

有些目标看似很遥远,但只要付出足够多的努力,这一切总有可能实现!
原文地址:https://www.cnblogs.com/Bravewtz/p/10022582.html