• 链表 插入排序


    参考了几个网上例子,验证后发现,不是最后几个元素会产生环,要么就是排序后不是稳定的(相同key值的元素,会意外改变顺序)

    最后自己写了个例子,用了2种方法写基于链表的插入排序,

    #include <stdio.h>
    #include <stdlib.h>
    #define null 0
    
    struct node;
    struct node{
        struct node *n;
        void *d;
        int k;
        int val;
    };
    
    typedef struct node nod;
    
    struct node* init(int size, int *val){
        struct node *head = malloc(sizeof(struct node));
        struct node *c = head;
        head->k = 0;
        for(int i = 0; i < size; i++){
            struct node *n= malloc(sizeof(struct node));
            n->k = val[i];
            n->val = i;
            c->n = n;
            c = n;
        }
        c=head->n;
        free(head);
        return c;
    }
    
    void print_n(struct node *n){
        while(n != null){
            printf("%d(%d) -> ",n->k,n->val);
            n = n->n;
        }
        printf("
    ");
    }
    
    
    nod* insert_sort3(nod *h){
        nod *pre;
        nod *p,*cur,*n;
        nod *dummy = malloc(sizeof(nod));
        dummy->n = h;
        p=dummy;
        //pre=dummy;
        cur=h;
        //n=h;
    
        while(cur != null){
            n = cur->n;
            pre = dummy;
            while(pre != null && pre->n != null && pre->n->k <= cur->k && pre->n != cur){// stabilize
                pre = pre->n;
            }
            if(pre->n == cur){
                p = p->n;
            }else{
                cur->n = pre->n;
                pre->n = cur;
                p->n = n;
            }
            cur = n;
        }
        h = dummy->n;
        free(dummy);
        return h;
    }
    
    void main(){
        int val[] = {3,6,2,1,5,4,2,4};
        int len = sizeof(val)/sizeof(val[0]);
    
        nod *n = init(len,val);
        nod *n2 = init(len,val);
        printf("original data : 
    ");
        print_n(n);
    
        printf("sorted data : 
    ");
        nod *sn2 = insert_sort3(n2);
        print_n(sn2);
    }

    输出:

    root@ubuntu:~/cdir# gcc insert_sort_linkedlist.c -o insert_sort_linkedlist.bin -g
    root@ubuntu:~/cdir# ./insert_sort_linkedlist.bin 
    original data : 
    3(0) -> 6(1) -> 2(2) -> 1(3) -> 5(4) -> 4(5) -> 2(6) -> 4(7) -> 
    sorted data : 
    1(3) -> 2(2) -> 2(6) -> 3(0) -> 4(5) -> 4(7) -> 5(4) -> 6(1) -> 

    通过括号内给的 val 值,可以看到 ,相同key的 2 和 4,排序后,相对位置没有发生改变,保证了稳定性

    睡觉

  • 相关阅读:
    Struts2常用标签总结
    静态代理模式
    Struts2 级联下拉框 详解析
    Hibernate 数据的批量插入、更新和删除
    Java JDBC批处理插入数据操作
    Hibernate中 一 二级缓存及查询缓存(2)
    Matlab获取colorbar颜色并转换为需要的CPT文件
    GMT5 自定义坐标轴
    [转载]matlab绘制同潮同潮实线和等振幅线(2)
    [转载]Matlab小波工具箱的使用2
  • 原文地址:https://www.cnblogs.com/cyy12/p/11802907.html
Copyright © 2020-2023  润新知