哈希排序:
==該方法實質上是一種分組插入方法
比較相隔較遠距離(稱為增量)的數,使得數移動時能跨過多個元素,則進行一次比[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?'\n':' ');
}
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?'\n':' ');
}
return 0;
}
```
