数据结构——八大排序

基本结构:

typedef struct array_list { //升级版数组
    int length;
    int* values;
} array_list;

void swap_values(array_list** ppal, int indexA, int indexB) { //交换升级版数组的指定下标的值
    int temp = (*ppal)->values[indexA];
    (*ppal)->values[indexA] = (*ppal)->values[indexB];
    (*ppal)->values[indexB] = temp;
}

void init_array_list(array_list** ppal, int length) { //初始化升级版数组
    (*ppal) = (array_list*)malloc(sizeof(array_list));
    (*ppal)->length = length;
    (*ppal)->values = (int*)malloc(sizeof(int) * (*ppal)->length);
    init_values(ppal);
}

void init_values(array_list** ppal) {//给升级版数组里面的存数的数组赋随机值
    int i = 0;
    for(i = 0; i < (*ppal)->length; i++) {
        (*ppal)->values[i] = rand();
    }
}

一、冒泡排序:

void bubble_sort(array_list* pal){
    int i=0,j=0;
    for(i=0;i<pal->length;i++){
        for(j=pal->length-1;j>i;j--){
            if(pal->values[j] < pal->values[j-1]){
                swap_values(&pal,j,j-1);
            }
        }
    }
} 

二、选择排序:

void selection_sort(array_list* pal){
    int i=0,j=0,min=0;
    for(i=0;i<pal->length;i++){
        min = i;
        for(j=i+1;j<pal->length;j++){
            if(pal->values[j] < pal->values[min]){
                min = j;
            }
        }
        swap_values(&pal,min,i);
    }
}

三、插入排序:

void insertion_sort(array_list* pal){
    int i=0,j=0,temp=0;
    for(i=1;i<pal->length;i++){
        if(pal->values[i] < pal->values[i-1]){
            temp = pal->values[i];
            for(j=i-1;pal->values[j] > temp;j--){
                pal->values[j+1] = pal->values[j];
            }
            pal->values[j+1] = temp;
        }
    }
}

四、希尔排序:

void shell_sort(array_list* pal) {
    int i = 0, j = 0, k = 0, increment = 0, temp = 0;
    for(increment = pal->length / 2; increment > 0; increment /= 2) {
        for(i = 0; i < increment; i++) {
            for(j = increment + i; j < pal->length; j += increment) {
                if(pal->values[j] < pal->values[j - increment]) {
                    temp = pal->values[j];
                    for(k = j - increment; k >= 0 && pal->values[k] > temp; k -= increment) {
                        pal->values[k + increment] = pal->values[k];
                    }
                    pal->values[k + increment] = temp;
                }
            }
        }
    }
}

五、堆排序:

注:使用堆排序的时候,待排序的数组的长度要比要排序的数据的个数大1,因为在堆排序中数组的第0个位置没作用,不能用来存数据。

void heap_sort(array_list* pal) {
    int i = 1;
    for(i = pal->length / 2; i >= 1; i--) {//注意这里的循环条件。不是i>=0
        heap_adjustion(&pal, i, pal->length - 1);
    }
    for(i = pal->length - 1; i > 1; i--) {//注意这里的循环条件,不是i>0
        swap_values(&pal, 1, i);
        heap_adjustion(&pal, 1, i - 1);
    }
}

void heap_adjustion(array_list** ppal, int start, int end) {
    int i = 0, temp = 0;
    temp = (*ppal)->values[start];
    for(i = 2 * start; i <= end; i *= 2) {
        /*注意这里要在i<end的条件下才能判断左子节点和右节节点的关系*/
        if(i < end && (*ppal)->values[i] < (*ppal)->values[i + 1])i++;
        if((*ppal)->values[i] <= temp)break;
        (*ppal)->values[start] = (*ppal)->values[i];
        start = i;
    }
    (*ppal)->values[start] = temp;
}

六、归并排序:

七、快速排序:

八、基数排序:

时间: 2024-08-05 19:35:59

数据结构——八大排序的相关文章

数据结构——八大排序算法

驱动程序: public class Main { public static void main(String[] args) {        int[] array={2,0,3,4,1,9,6,8,7,5};        print(Sort.bubbleSort(array, true));//冒泡        print(Sort.InsertionSort(array, true));//插入        print(Sort.mergeSort(array,true, "r

我的软考之路(六)——数据结构与算法(4)之八大排序

排序是编程的基础,在程序中会常常使用,好的排序方法能够帮助你提高程序执行的效率,所以学好排序,打好基础,对于程序的优化会手到擒来.不管你的技术多么强,假设没有基础也强不到哪去. 不多说了,我们直接进入今天的主题. 总有人说排序非常难,可是我总认为非常easy,我们仅仅须要了解基本思想就好了,通过简单的样例来加深理解. 1.直接插入排序 (1)简单介绍:直接插入排序,从字面意思能够看出,直接插入数据完毕排序. (2)基本思想:在插入第i个数时,如果前i-1数已经排好序了,仅仅须要将第i个数插入到i

数据结构常见的八大排序算法(详细整理)

https://www.jianshu.com/p/7d037c332a9d?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=weixin-friends 八大排序,三大查找是<数据结构>当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法.常见的八大排序算法,他们之间关系如下: 排序算法.png 他们的性能比较: 性能比较.png 下面,利用Python分别将他

数据结构与算法之——八大排序算法

附:关于这个主题,网上好的文章已经数不胜数,本篇是整合后的文章. 正文: 一.概述 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 本文所指八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 二.排序算法详述 1.

数据结构之排序算法(八大排序)-(八)

排序算法可以分为稳定排序和不稳定排序.在简单形式化一下,如果A[i] = A[j],A[i]原来在位置前,排序后A[i]还是要在A[j]位置前,这才能叫稳定排序.排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用.基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的.另外,如果排序算法稳定,对基于比较的排序算法而言,元素交换的次数可能会少一些(个人感觉,没有证实). 回到主题,现在分析一下常见的排序

Python学习(三) 八大排序算法的实现(下)

本文Python实现了插入排序.基数排序.希尔排序.冒泡排序.高速排序.直接选择排序.堆排序.归并排序的后面四种. 上篇:Python学习(三) 八大排序算法的实现(上) 1.高速排序 描写叙述 通过一趟排序将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整个排序过程能够递归进行,以此达到整个数据变成有序序列. 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全

八大排序算法及其比较

八大排序算法及其比较 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 常见的内部排序算法有:冒泡排序.选择排序.插入排序.希尔排序.堆排序.快速排序.归并排序.基数排序等. 前面三种是简单排序,后续算法是在前面基础上进行优化.本文将基于C语言,依次介绍上述八大排序算法. 1 八大排序算法 1.1 冒泡排序 主要思想:依次对两个数比较大小,较大的数冒起来,较小的数压下来. 形象理解:一队新

Python实现八大排序算法

Python实现八大排序算法,具体内容如下 1.插入排序描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法.插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素).在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中. 代码实现 def insert

八大排序算法原理以及Java实现(直接插入排序)

概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 1.插入排序-直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到