温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C语言 排序算法 - 数据结构学习笔记

发布时间:2020-07-15 12:09:42 来源:网络 阅读:595 作者:Mr_haha 栏目:编程语言
/**  功能:     排序
  *日期:     2017年9月24日
  *作者:     yzh
  *开发环境:  QT
  **/



#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STACK_LENGTH 100     //非递归快速排序调用栈
#define MAX_LENGTH 20            //数组最大值

//对于数值型 keyType
#define EQ(a,b) ((a) == (b))     //比较 a == b ?
#define LT(a,b) ((a) < (b))      //比较 a < b ?
#define LQ(a,b) ((a) <= (b))     //比较 a <= b ?

typedef int KeyType;             //查找关键字类型
typedef char InfoType;           //其他信息

typedef struct {                 // 信息体
    KeyType key;
    InfoType otherInfo;
}RedType;

typedef struct {                //数组结构
    RedType r[MAX_LENGTH+1];    //r[0]闲置或用作哨兵;
    int length;
}SqList;

typedef struct {                //栈节点
    int l,h;

}StackNode;

typedef struct {                //栈
    StackNode node[MAX_STACK_LENGTH];
    int idx;
}Stack;


//插入模拟数据
int insertSQ(SqList *list){

    for(int i = 1;i<MAX_LENGTH+1;i++){
        list->r[i].key = rand()%1000;
        list->r[i].otherInfo = 96+i;
    }
    list->length = MAX_LENGTH+1;
}

//打印数组
int printf_SQ(SqList *list){
    for(int i = 1 ; i<list->length ; i++){
        if(i<list->length-1){
            printf("%d,",list->r[i]);
        }else{
            printf("%d\n",list->r[i]);
        }

    }
}

//插入排序
int sort_I(SqList *list){
    int i,j;
    for(i = 2;i<list->length;++i){
        if(LT(list->r[i].key,list->r[i-1].key)){
            list->r[0] = list->r[i];
            list->r[i] = list->r[i-1];
            for(j = i-2;LT(list->r[0].key,list->r[j].key); --j){
                list->r[j+1] = list->r[j];
            }
            list->r[j+1] = list->r[0];
        }

    }
}

//插入排序改进:折半插入排序
int sort_B_I(SqList *l){
    int i , j;
    int low , high,mid;
    for(i = 2; i<l->length;i++){
        if(LT(l->r[i].key,l->r[i-1].key)){
            l->r[0] = l->r[i];
            l->r[i] = l->r[i-1];
            low = 1;high = i-2;
            while(low<=high){
                mid = (low+high)/2;
                if(LT(l->r[0].key,l->r[mid].key)){
                    high = mid -1;
                }else{
                    low = mid+1;
                }
            }
            for(j = i-2; j>high;j--){
                l->r[j+1] = l->r[j];
            }
            l->r[high+1] = l->r[0];
        }
    }
}

//冒泡排序
int sort_B(SqList *list){
    int i,j;
    for(i = 1;i<list->length;i++){
        for(j = i+1;j<list->length ; j++){
            if(LT(list->r[j].key,list->r[i].key)){
                list->r[0] = list->r[j];
                list->r[j] = list->r[i];
                list->r[i] = list->r[0];
            }
        }
    }
}

//选择排序
int sort_S(SqList *list){
    int i,j;

    for(i = 1 ; i<list->length ;i++){
        list->r[0] = list->r[i];
        int min = i;
        for(j = i+1; j<list->length ; j++){
            if(LT(list->r[j].key,list->r[0].key)){
                list->r[0] = list->r[j];
                min = j;
            }
        }
        list->r[min] = list->r[i];
        list->r[i] = list->r[0];


    }
}

//快速排序
int Partition(SqList *L,int l ,int h){
    L->r[0] = L->r[l];

    while(LT(l,h)){
        while(LT(l,h)&&LT(L->r[0].key,L->r[h].key)){--h;}
        L->r[l] = L->r[h];
        while(LT(l,h)&&LQ(L->r[l].key,L->r[0].key)){++l;}
        L->r[h] = L->r[l];
    }
    L->r[l] = L->r[0];
    return l;
}

//递归算法
void QSort(SqList *L, int low, int high) {  //算法10.7
  // 对顺序表L中的子序列L.r[low..high]进行快速排序
  int pivotloc;
  if (low < high) {                      // 长度大于1
    pivotloc = Partition(L, low, high);  // 将L.r[low..high]一分为二
    QSort(L, low, pivotloc-1);           // 对低子表递归排序,pivotloc是枢轴位置
    QSort(L, pivotloc+1, high);          // 对高子表递归排序
  }
} // QSort

StackNode pop(Stack *stack){

    StackNode node = stack->node[stack->idx];
    stack->idx--;
    return node;
}

void push(Stack *stack , int l,int h){
    stack->idx++;
    stack->node[stack->idx].h = h;
    stack->node[stack->idx].l = l;
}

//非递归算法
void sort_Q(SqList *L,int low,int high){
    int pivotloc;
    Stack stack;
    push(&stack,low,high);
    StackNode node;
    while(stack.idx>0){
        node = pop(&stack);
        if(node.l <node.h){
            pivotloc = Partition(L, node.l, node.h);
            push(&stack,pivotloc+1,node.h);
            push(&stack,node.l,pivotloc-1);
        }
    }
}

void QuickSort(SqList *L) {          // 算法10.8
   // 对顺序表L进行快速排序
   //sort_Q(L, 1, L->length-1);    //调用非递归快速排序
   //QSort(L, 1, L->length-1);        //调用递归快速排序
} // QuickSort



int main(int argc, char *argv[])
{
//    测试栈
//    Stack stack;
//    push(&stack , 1,2);
//    push(&stack , 2,3);
//    push(&stack , 4,6);
//    StackNode node= pop(&stack);
//    printf("%d,%d\n",node.l,node.h);
//    StackNode node2= pop(&stack);
//    printf("%d,%d\n",node2.l,node2.h);
//    StackNode node3= pop(&stack);
//    printf("%d,%d\n",node3.l,node3.h);
//    return 0;


    SqList list;

    insertSQ(&list);    //插入模拟数据
    printf_SQ(&list);   //打印测试数据
    //(41,467,334,500,169,724,478,358,962,464,705,145,281,827,961,491,995,942,827,436)
    printf("-------------------------------------------\n");
//    sort_B(&list);    //冒泡排序
//    sort_I(&list);    //插入排序
//    sort_S(&list);    //选择排序
//    sort_B_I(&list);  //插入排序改进:折中插入排序
    QuickSort(&list);   //快速排序

    printf_SQ(&list);   //打印排序后数组
    //(41,145,169,281,334,358,436,464,467,478,491,500,705,724,827,827,942,961,962,995)
    printf("-------------------------------------------\n");

    return 0;
}
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI