算法 --- 排序(冒泡、插入、选择)

目录

如何分析一个“排序算法”?

1、排序算法的执行效率

2、排序算法的内存消耗

3、排序算法的稳定性

数组排序数据结构

一、冒泡排序

二、插入排序

三、选择排序


如何分析一个“排序算法”?

1、排序算法的执行效率

对于排序算法执行效率的分析,一般会从这几个方面来衡量:

1. 最好情况、最坏情况、平均情况时间复杂度

2. 时间复杂度的系数、常数 、低阶

3. 比较次数和交换(或移动)次数

2、排序算法的内存消耗

算法的内存消耗可以通过空间复杂度来衡量,排序算法也不例外。不过,针对排序算法的空间复杂度,我们还引入了一个新的概念,原地排序(Sorted in place)就是特指空间复杂度是 O(1) 的排序算法。冒泡排序、插入排序、选择排序 都属于原地排序

3、排序算法的稳定性

稳定性:如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变,那就是稳定的排序算法,如果顺序变化则是不稳定的排序算法。

数组排序数据结构

struct sort_array
{
    int size; /* array size */
    int num;  /* array num */
    int *p;  /* array */
};

一、冒泡排序

冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作;第i次需比较的次数为n-i-1。比如我们要对一组数据 4,5,6,3,2,1,从小到大进行排序。第一次冒泡操作的详细过程如图【左】,整个排序过程如图【右】

/**
 * bubble sort.
 * 
 * @param array: 
 * @return -1:array is null or num <= 1
 *          0:success
 */
int bubble_sort(struct sort_array *array)
{
    int i,j,temp=0,swap_flag=0;

    if (array == NULL || array->num <= 1)
        return -1;

    for (i=0; i<array->num; i++)
    {
        swap_flag = 0;
        for (j=0; j<array->num-i-1; j++)
        {
            if (array->p[j] > array->p[j+1])
            {
                temp = array->p[j];
                array->p[j] = array->p[j+1];
                array->p[j+1] = temp;
                swap_flag = 1;
            }
        }
        if (!swap_flag)
            break;
    }

    return 0;
}

二、插入排序

将数组中的数据分为两个区间,已排序区间和未排序区间,初始已排序区间只有一个元素,就是数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束

/**
 * insertion sort.
 * 
 * @param array: 
 * @return -1:array is null or num <= 1
 *          0:success
 */
int insertion_sort(struct sort_array *array)
{
    int i,j,temp=0;

    if (array == NULL || array->num <= 1)
        return -1;

    for (i=1; i<array->num; i++)
    {
        temp = array->p[i];
        for (j=i-1; j>=0; j--)
        {
            if (array->p[j] > temp)
            {
                array->p[j+1] = array->p[j]; /* move data */
            }
            else
            {
                break;
            }
        }
        array->p[j+1] = temp; /* inseert data */
    }
    
    return 0;
}

 

三、选择排序

选择排序算法的实现思路有点类似插入排序,也分已排序区间和未排序区间。但是选择排序每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾。

/**
 * selection sort.
 * 
 * @param array: 
 * @return -1:array is null or num <= 1
 *          0:success
 */
int selection_sort(struct sort_array *array)
{
    int i,j,temp=0,idex=0;

    if (array == NULL || array->num <= 1)
        return -1;

    for (i=0; i<array->num-1; i++)
    {
        idex = i;
        for (j=i+1; j<array->num; j++)
        {
            if (array->p[j] < array->p[idex])
            {
                idex = j;
            }
        }

        if (idex == i)
            continue;
        
        temp = array->p[i];
        array->p[i] = array->p[idex];
        array->p[idex] = temp;
    }
    
    return 0;
}
发布了35 篇原创文章 · 获赞 22 · 访问量 1143

猜你喜欢

转载自blog.csdn.net/m0_37845735/article/details/103341978