#define LENGTH 10
/*冒泡排序算法的运作如下:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。*/
int i, j, tmp, number[LENGTH] = {95, 45, 15, 78, 84, 51, 24, 12};
for (i = 0; i < LENGTH; i++) {
for (j = LENGTH - 1; j > i; j--) {
if (number[j] < number[j-1]) {//相邻两个数比较,由小到大排序
//if (number[j] > number[j-1]) //相邻两个数比较,由大到小排序
tmp = number[j-1];
number[j-1] = number[j];
number[j] = tmp;
}
}
}
for (i = 0; i < LENGTH; i++) {
printf("%d ", number[i]);
}
printf("\n");
/*执行次数为:
(n-1)+(n-2)+(n-3)+……+3+2+1 = (n-1)*n/2 = (n^2 - n)/2
即时间复杂度为: O(n^2)
*/
/*选择排序基本思想:
1、将所有数种最小的数与a[0]交换
2、将a[1]到a[n - 1]中最小的数与a[1]交换
3、....
没比较一趟找出一个未经排序的数中最小的数,共比较n - 1轮
时间复杂度:
每趟先从s[i]+1~s[n-1]找出最大元素或者最小元素,与s[i]进行比较、交换;
总的比较次数为: n(n-1)/2,即时间复杂度为: O(n^2)
*/
int num[LENGTH] = {12,182,17,78,23,69,90,47,45,32};
int i,j,k,t;
for (i = 0; i < LENGTH - 1; i++) {//进行LENGTH - 1趟的比较
k = i;
for (j = i + 1; j < LENGTH; j++) {//找出没有排序中最小的数
if (num[j] < num[k]) {//从小到大
//if (num[j] > num[k]) 从大到小
k = j;
}
}
//将没有排序的最小的数放到最前面
t = num[k];
num[k] = num[i];
num[i] = t;
}