稳定排序个人浅见(stable sort)
稳定两个字说的就是排序过程中和排序结果里数值相等的数据的先序关系没有发生变化。
如:
排序前 | 9 | 6 | 3 | 6* |
---|---|---|---|---|
排序结果 | 3 | 6 | 6* | 9 |
(排序后原先在后边的6依然在后边,这就是稳定的。)
冒泡排序(buble sort)
1、具体内容
1.1冒泡排序原理:
1、对于有n个数的待排序序列,共需进行n-1趟排序,;2、每次排序,都将第k大的数交换至n+1-k位上(即每次只选出未排序中的最大的一个放到该组最后边);3、重复,直至未排序组只剩一个。
1.2分析
时间复杂度:
最好情况:待排序序列已经是升序的了,比较次数n-1,移动次数0。O(n)
最坏情况:待排序序列是逆序的,比较次数n*(n-1)/2,移动次数3n*(n-1)/2。O(n^2)
每次比较的个数较上一次减一,因为上一组最大的那个已经选出来放在最后边了,排好序了。故是一个以n为首相,-1为公差的等差数列。由于是采用一个临时变量实现数值交换的,故每次交换有3次操作,于是移动次数为比较次数乘3.
空间复杂度:
不需要额外辅助存储空间。
2、实现代码
#include <stdio.h>
#define ARR_LEN 255 /*数组容量*/
#define elemType int /*数据类型*/
/* elemType arr[]: 排序目标数组; int len: 元素个数 */
void bubbleSort (elemType arr[], int len)
{
elemType temp;
int i, j;
for (i=0; i<len-1; i++) /* 外循环为总排序趟数*/
{
for (j=0; j<len-1-i; j++)/* 内循环为每趟比较的次数,*/
{
if (arr[j] > arr[j+1])/* 相邻元素比较,若逆序则交换(升序为左大于右,降序反之) */
{
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
int main (void) {
elemType arr[ARR_LEN] = {6,5,-99,-7,4,100,-6,8,10,4};//待排序序列
int len = 10;//排序长度
int i;
bubbleSort (arr, len);
for (i=0; i<len; i++)
printf ("%d\t", arr[i]);
printf("\n");
return 0;
}