zoukankan      html  css  js  c++  java
  • 王道8.6

    #include "stdio.h"
    #include "stdlib.h"
    typedef int ElemType;
    typedef struct LNode{
        ElemType data;
        struct LNode* next;
    }LNode,*LinkList;
    //不带头结点
    void selectSort(LinkList* L) {
        LNode * h = L, * p, * q, * r, * s;
        L = NULL;
        while (h != NULL) {
            p = s = h;
            q = r = NULL;
            while (p != NULL) {
                if (p->data > s->data) {
                    s = p;
                    r = q;
                }
                q = p;
                p = p->next;
            }
            if (s == h)
                h = h->next;
            else
                r->next = s->next;
            s->next = L;
            L = s;
        }
    }
    //判断一个数据序列是否构成一个小根堆,扫描所有分支结点,遇到孩子结点的关键字小于根结点的关键字时返回false,扫描完后返回true
    int IsMinHeap(ElemType A[], int len) {
        int i;
        if (len % 2 == 0) {//len为偶数,有一个单分支结点
            if (A[len / 2] > A[len])//判断单分支结点
                return 0;
            for (i = len / 2 - 1; i >= 1; i--)//判断所有双分支结点
                if (A[i] > A[2 * i] || A[i] > A[2 * i + 1])
                    return 0;
        }
        else {//len为奇数时,没有单分支结点
            for (i = len / 2; i >= 1; i--)//判断所有双分支结点
                if (A[i] > A[2 * i] || A[i] > A[2 * i + 1])
                    return 0;
        }
        return 1;
    }
    //顺序表前m个元素递增有序,后n个元素递增有序
    //将数组A[1...m+n]视为一个已经过m趟插入排序的表,则从m+1趟开始,将后n个元素依次插入到前面的有序表中
    void InsertSort(ElemType A[], int m, int n) {
        int i, j;
        for (i = m + 1; i <= m + n; i++) {
            A[0] = A[i];
            for (j = i - 1; A[j] > A[0]; j--)
                A[j + 1] = A[j];
            A[j + 1] = A[0];
        }
    }
    //计数排序,统计关键字比它小的元素个数,然后把它放入另一个数组对应的位置上
    void CountSort(ElemType A[], ElemType B[], int n) {
        int count;
        int i, j;
        for (i = 0; i < n; i++) {
            for (j = 0, count = 0; j < n; j++)
                if (A[j] < A[i])
                    count++;
            B[count] = A[i];
        }
    }
    //计数排序优化,任意两个记录之间只比较一次
    void CountSortt(ElemType A[], ElemType B[], int n) {
        int i, j;
        int count;
        for (i = 0; i < n; i++)
            A[i].count=0;
        for (i = 0; i < n; i++) {
            for (j = i + 1; j < n; j++)
                if (A[i] < A[j])
                    A[j].count++;
                else
                    A[i].count++;
            B[A[i].count] = A[i];
        }
    }
    
    //以kn为枢轴进行一次快速排序
    int Partition(ElemType K[], int n) {
        int i = 1, j = n;
        ElemType pivot = K[j];
        while (i < j) {
            while (i < j && K[i] <= pivot)
                i++;
            if (i < j)
                K[j] = K[i];
            while (i < j && K[j] >= pivot)
                j--;
            if (i < j)
                K[i] = K[j];
        }
        K[i] = pivot;
        return i;
    }
    努力的意义就是放眼望去以后都是喜欢的人和事......
  • 相关阅读:
    UVA 10462 Is There A Second Way Left?(次小生成树&Prim&Kruskal)题解
    POJ 1679 The Unique MST (次小生成树)题解
    POJ 2373 Dividing the Path (单调队列优化DP)题解
    BZOJ 2709 迷宫花园
    BZOJ 1270 雷涛的小猫
    BZOJ 2834 回家的路
    BZOJ 2506 calc
    BZOJ 3124 直径
    BZOJ 4416 阶乘字符串
    BZOJ 3930 选数
  • 原文地址:https://www.cnblogs.com/Lorrained/p/15286603.html
Copyright © 2011-2022 走看看