美文网首页
数据结构与算法 排序(一)

数据结构与算法 排序(一)

作者: 今年27 | 来源:发表于2022-02-16 15:08 被阅读0次
typedef struct {
    int* data;
    int length;
} Sqlist;

void swap(Sqlist* L, int m, int n){
    int tem = L->data[m];
    L->data[m] = L->data[n];
    L->data[n] = tem;
}

void print(Sqlist L){
    int i = 1;
    for (i = 1; i < L.length; i++) {
        printf("%d", L.data[i]);
    }
    printf("%d",L.data[i]);
    printf("\n");
}

冒泡排序

//冒泡排序
void bubbleSort(Sqlist *L){
    int sorted = 1;//优化
    for (int i = 1; i < L->length; i++) {
        sorted = 0;
        for (int j = L->length-1; j > i; j--) {
            if (L->data[j] > L->data[j+1]) {
                swap(L, j, j+1);
                sorted = 1;
            }
        }
        if (sorted == 0) {//如果在对比的过程中发现已经有序,则不需要再进行对比
            break;
        }
    }
}

简单的选择排序

//简单的选择排序
void selectSort(Sqlist *L){
    int i, j , m;
    for (i = 1; i < L->length; i++) {
        m = i;//假设第一个最小
        for (j = i + 1; j <= L->length; j++) {
            if (L->data[m] > L->data[j]) {//那第一个和后面的比
                m = j;//直到找到最小
            }
        }
        if (i != m) {
            swap(L, i, m);//交换
        }
    }
}

插入排序

//插入排序
void insertSort(Sqlist *L){
    int i, j;
    int temp = 0;
    for (i = 2; i <= L->length; i++) {
        if (L->data[i] < L->data[i-1]) {
            temp = L->data[i];
            for (j = i - 1; L->data[j]>temp; j--) {
                    L->data[j+1] = L->data[j];
            }
            L->data[j + 1]=temp;
        }
       
    }
}

希尔排序

//希尔排序
void shellSort(Sqlist *L){
    int step = L->length;
    int tem = 0;
    int i,j;
    do {
        step = step/3 + 1;
        for (i = step + 1; i <= L->length; i++) {
            if (L->data[i] < L->data[i-step]) {
                tem = L->data[i];
                for (j = i - step; L->data[j]>tem; j-=step) {
                    L->data[j+step] = L->data[j];
                }
                j+=step;
                L->data[j] = tem;
            }
        }
    } while (step > 1);
}

堆排序

void heapAdjust(Sqlist *L, int n, int m){
    int tem, i;
    tem = L->data[n];
    for (i = 2 * n; i <= m; i*=2) {
        if (i < m && L->data[i] < L->data[i+1]) {
            i++;
        }
        if (tem >= L->data[i]) {
            break;
        }
        L->data[n] = L->data[i];
        n = i;
    }
    L->data[n] = tem;
}

void heapSort(Sqlist *L){
    for (int i = L->length/2; i >= 1; i--) {
        print(*L);
        heapAdjust(L, i, L->length);
    }
    
    for (int i = L->length; i > 1; i--) {
        swap(L, 1, i);
        heapAdjust(L, 1, i-1);
    }
}


归并排序

void mergeData(int sourceData[], int newData[], int low, int mid, int high){
    int lowInFirstArray = low;
    int lowInSecondArray = mid+1;
    int indexInNewArray = low;
    //将两个有序数组合并
    for (; lowInFirstArray <= mid && lowInSecondArray <= high; indexInNewArray++) {
        if (sourceData[lowInFirstArray] < sourceData[lowInSecondArray]) {
            newData[indexInNewArray] = sourceData[lowInFirstArray];
            lowInFirstArray++;
        } else {
            newData[indexInNewArray] = sourceData[lowInSecondArray];
            lowInSecondArray++;
        }
    }
//    printf("i:%d, j:%d, k:%d\n", lowInFirstArray, lowInSecondArray, indexInNewArray);
    //将两个数组剩余的部分加入尾部
    if (lowInFirstArray <= mid) {//前数组有剩余
        for (int i = 0; i <= mid - lowInFirstArray; i++) {
            newData[indexInNewArray + i] = sourceData[lowInFirstArray+i];
        }
    }
    if (lowInSecondArray <= high) {//后数组有剩余
        for (int i = 0; i <= high - lowInSecondArray; i++) {
            newData[indexInNewArray + i] = sourceData[lowInSecondArray+i];
        }
    }
}

void mergeAdapt(int sourceData[], int newData[], int low, int high){
    if (low == high) {
        newData[low] = sourceData[low];
    } else {
        int mid = (low + high)/2;
        int tempData[1000] = {0};
        
        mergeAdapt(sourceData, tempData, low, mid); //递归
        printData(tempData, 9);//打印tempData

        mergeAdapt(sourceData, tempData, mid+1, high);//递归
        
        printData(tempData, 9);//打印tempData
        mergeData(tempData, newData, low, mid, high);//合并
    }
}

void mergeSort(Sqlist *L){
    mergeAdapt(L->data, L->data, 1, L->length);
}

下图打印了整个tempData在归并的过程中的变化


归并排序

快速排序

int findPrior(Sqlist* L, int left, int right){
    int low = left;
    int high = right;
    int prior = L->data[left];//选定第一个作为默认中轴,可以优化
    while (low < high) {
        while (low < high && L->data[high] >= prior) {//如果high >= 中轴 则high--
            high--;
        }
        swap(L, low, high);//将小值前沉

        while (low < high && L->data[low] <= prior) {//low <= 中轴 则 low++
            low++;
        }
        swap(L, low, high);//将大值后沉
    }
    return low;
}



void qSort(Sqlist *L, int left, int right){
    if (left < right) {
        int prior = findPrior(L, left, right);
        qSort(L, left, prior - 1);
        qSort(L, prior + 1, right);
    }
}


void quickSort(Sqlist* L){
    qSort(L, 1, L->length);
}

相关文章

  • 排序算法-堆排序

    参考: Java排序算法(五):堆排序 【算法与数据结构】图说堆排序 【数据结构】排序算法:希尔、归并、快速、堆排...

  • (转)排序算法

    排序算法点这里 数据结构与算法——计数排序、桶排序、基数排序

  • 算法与数据结构(六):堆排序

    title: 算法与数据结构(六):堆排序tags: [算法与数据结构, C语言, 堆排序]date: 2019-...

  • 数据结构与算法 - 排序与搜索

    文章来源:数据结构与算法(Python) 排序与搜索排序算法(英语:Sorting algorithm)是一种能将...

  • 10分钟看懂10大经典算法(Swift代码实现)

    排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进...

  • 排序算法

    排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序。 内部排序是数据记录在内存中...

  • Python实现十大经典排序算法

    排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进...

  • Hash算法

    数据结构与算法分析:大纲数据结构:数组算法:hash算法算法:排序算法Java实现 1 Hash算法? 将任意长度...

  • Swift的十大经典排序算法总结

    Swift的十大经典排序算法总结 排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排...

  • Java学习笔记——十大经典排序算法总结

    内容几乎完全来源于网络 排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序,内部...

网友评论

      本文标题:数据结构与算法 排序(一)

      本文链接:https://www.haomeiwen.com/subject/ggorlrtx.html