数据结构顺序表排序算法练习

/**
 * @file        testsqlist.c
 * @brief       顺序表实现排序
 *              
 * @author      UncleBb
 * @version     0.0.0.1
 * @date        2021/12/10
 */

#include <stdio.h>
#define MAX_LEN 20

struct ARRAY_LIST{
    int index;
    int data[MAX_LEN];
};

struct SHELL_DL{
    int dl[MAX_LEN];
    int len;
};

void init(struct ARRAY_LIST *arr){

    if(NULL == arr){
        return;
    }
    arr->index = 0;

}

//用于直接插入排序的初始化,带哨兵
void init2(struct ARRAY_LIST *arr){

    if(NULL == arr){
        return;
    }
    arr->index = 1;
    arr->data[0] = NULL;

}

void InitBl(struct SHELL_DL *dl){
    dl->len = 3;
    dl->dl[0] = 3;
    dl->dl[1] = 2;
    dl->dl[2] = 1;
}

void add(struct ARRAY_LIST *arr,int value){

    if(arr->index == MAX_LEN){
        printf("顺序表已满,无法插入!\n");
        return;
    }
    arr->data[arr->index] = value;
    arr->index ++;

}

void out(struct ARRAY_LIST *arr){

    int i;
    i = 0;
    while (i < arr->index)
    {
        printf("%d ",arr->data[i]);
        i++;
    }
    printf("\n");

}

//冒泡排序
void BubbleSort(struct ARRAY_LIST *arr){
    
    int i,j;
    int temp;
    printf("元素个数:%d\n",arr->index);

    for(i = 0; i < arr->index; i++){
        for(j = 0; j < arr->index-1-i; j++){
            if(arr->data[j] < arr->data[j+1]){
                temp = arr->data[j];
                arr->data[j] = arr->data[j+1];
                arr->data[j+1] = temp;
            }
        }
    }

}

//直接插入排序,使用哨兵
void InsertSort(struct ARRAY_LIST *arr){

    int i,j;

    for(i = 2; i < arr->index; i++){
        if(arr->data[i] < arr->data[i-1]){
            //此时需要将其插入有序表
            //1、首先复制哨兵
            arr->data[0] = arr->data[i];
            
            for(j = i-1; arr->data[0] < arr->data[j]; j--){
                //2、后移,找到哨兵插入的正确位置
                arr->data[j+1] = arr->data[j];
            }

            //3、插入哨兵
            arr->data[j+1] = arr->data[0];
        }
    }
    
}

//希尔插入排序,dl为每次的步长
void ShellInsert(struct ARRAY_LIST *arr,int dl){

    int i,j;

    for(i = dl+1 ; i < arr->index; i++){
        if(arr->data[i] < arr->data[i-dl]){
            //此时需要将其插入有序表
            //1、首先复制哨兵
            arr->data[0] = arr->data[i];
            
            for(j = i-dl; arr->data[0] < arr->data[j]; j=j-dl){
                //2、后移,找到哨兵插入的正确位置
                arr->data[j+dl] = arr->data[j];
            }

            //3、插入哨兵
            arr->data[j+dl] = arr->data[0];
        }
    }
}

//希尔排序,就是直接插入加了个步长
void ShellSort(struct ARRAY_LIST *arr,struct SHELL_DL *dl){

    int i;

    for(i = 0; i < dl->len; i++){
        ShellInsert(arr,dl->dl[i]);
    }

}

int main(){

    struct ARRAY_LIST arr;
    struct SHELL_DL dl;

    init2(&arr);

    add(&arr,5);
    add(&arr,3);
    add(&arr,4);
    add(&arr,1);
    add(&arr,10);
    add(&arr,21);
    add(&arr,13);
    add(&arr,14);

    printf("排序前:");
    out(&arr);

    // InsertSort(&arr);
    InitBl(&dl);

    ShellSort(&arr,&dl);

    printf("排序后:");
    out(&arr);
    
}

上一篇:C语言—双向链表


下一篇:吴恩达dl.ai踩坑记录