zoukankan      html  css  js  c++  java
  • 哈希排序与归并排序

    哈希排序:

    ==该方法实质上是一种分组插入方法
    比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比[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;
    }

    ```

    有些目标看似很遥远,但只要付出足够多的努力,这一切总有可能实现!
  • 相关阅读:
    ThinkPHP框架知识(比较全的知识)
    利用smarty模板(登录、有关信息操作等功能)
    从零开始学习Node.js例子七 发送HTTP客户端请求并显示响应结果
    从零开始学习Node.js例子六 EventEmitter发送和接收事件
    从零开始学习Node.js例子五 服务器监听
    从零开始学习Node.js例子四 多页面实现数学运算 续二(client端和server端)
    从零开始学习Node.js例子四 多页面实现数学运算 续一(使用connect和express框架)
    从零开始学习Node.js例子四 多页面实现数学运算
    从零开始学习Node.js例子三 图片上传和显示
    从零开始学习Node.js例子二 文本提交与显示
  • 原文地址:https://www.cnblogs.com/Bravewtz/p/10022582.html
Copyright © 2011-2022 走看看