前提条件:
-大多数情况下,为了简单起见只讨论从小到大的排序
-N是正整数
-只讨论基于比较的排序(< > =有定义)
-只讨论内部排序,即加载到内存中的排序
相关概念
-稳定性:排序前相等的两个元素,排序后相对位置没有发生改变
-时间复杂度:时间复杂度是定量描述一个算法的运行的时间,一般与算法输入值的长度N有关,常用大O符号表述;
统一的入口
void X_sort(int arr[] ,int N)
ElenmentType 为数组类型 N 为数中元素的个数
示例图
主函数
//冒泡排序
void Bubble_sort(int arr[] ,int N){
//每趟排序都把最大的放最后一个,下次没必要比较最后一个
for (int i = N-1; i >= 0; i--) {
//判断是否已经有序,避免无用操作
bool flag = 0;
//比较相邻两个元素大小
for (int j = 0; j < i; j++) {
if (arr[j] > arr[j+1]) {
//交换两个元素
Swap(&arr[j], &arr[j+1]);
//元素有交换,更改flag值
flag = 1;
}
}
if (flag == 0) {
//这一趟没有交换任何元素,表明数组已为有序状态
break;
}
}
}
交换函数
//交换元素
void Swap(int *a,int *b){
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
时间复杂度:
没有一种排序在任何情况下都是表现最好
最好情况:顺序 T = O(N)
最坏情况:逆序 T = O(N^2)
稳定性: 稳定
测试
int main(int argc, const char * argv[]) {
//数组
int arr[9] ={8,6,1,2,4,9,3,7,5};
//冒泡排序函数
Bubble_sort(arr, 9);
//打印排序后结果
for (int j= 0; j< 9; j++) {
printf("%d",arr[j]);
}
return 0;
}
输出
Printing description of arr:
(int [9]) arr = ([0] = 1, [1] = 2, [2] = 3, [3] = 4, [4] = 5, [5] = 6, [6] = 7, [7] = 8, [8] = 9)