初学者学习,纠结很久冒泡排序的内层不减一为什么会出现越界呢,希望有人解释一下!
这是我写的冒泡排序
一、冒泡排序
升序:从小到大
降序:从大到小
1.1 基本思想
相邻的两个元素进行比较,按照要求进行交换。
冒泡排序的时间复杂度是 O(n^2) ,所以得用双层for循坏。
1.2 实现思路 --以升序为例
第一趟排序:
第一个元素和第二个元素进行,将较大的放在第二个位置上,
然后第二个元素和第三个元素比较,将较大的放在第三个位置上,
依次类推,直到第一趟排序完成,最大值就在最后一个位置上了
第二趟排序:
第一个元素和第二个元素进行,将较大的放在第二个位置上,
然后第二个元素和第三个元素比较,将较大的放在第三个位置上,
依次类推,直到第二趟排序完成,第二大的值就在倒数第二个位置上了
依次类推,直到真个序列有序。
#include <stdio.h>
int main(int argc, char **argv)
{
char str[] = {1, 3, 5, 7, 9, 11, 12, 2, 4, 6, 8, 10};
int len = sizeof(str) / sizeof(str[0]);//计算数组的长度
int i = 0;
int j = 0;
int temp = 0;
#if 0
//先完成第一趟排序
for(i = 0; i < len-1; i++){ //此处的len-1 是为了防止越界的
if(s[i] > s[i+1]){
//交换元素
temp = s[i];
s[i] = s[i+1];
s[i+1] = temp;
}
}
#endif
for (j = 0; j < len - 1; j++)//此处减一是最后一个元素不用再进行比较
{
for (i = 0; i < len - 1-j ; i++)//此处减一是防止越界问题,减J是没遍历一次少比较一个元素
{
if (str[i + 1] < str[i])//如果是降序 只需将此处的 > 改成 < 即可
{
temp = str[i];
str[i] = str[i + 1];//三杯水交换,
str[i + 1] = temp;
}
temp = 0;
}
}
for (i = 0; i < 12; i++)
{
printf("%d ", str[i]);
}
printf("\n");
return 0;
}
