目录
如何分析一个“排序算法”?
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;
}