我对数据结构中“排序”的理解 1:冒泡排序
1. 排序就是排序。不是边输入边排序。
2. 要把问题拆开。分成先输入后排序。
3. 对存在的数组。进行排序
4. 关心的是排序算法
以上 4 点大同小异,强调注重算法。。。
5. 所有算法都省略了以下初始化;
————————————————————————————————
int a[10],i,j,k;
printf("Please input 10 numbers for sort:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
————————————————————————————————
A. 冒泡排序
百度百科:
冒泡排序,是指计算机的一种排序方法,它的时间复杂度为 O ( n^2 ),虽然不及堆排序、快速排序的 O ( nlogn ,底数为 2 ),但是有两个优点: 1. “编程复杂度”很低,很容易写出代码; 2. 具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,而堆排序、快速排序均不具有稳定性。不过,一路、二路归并排序、不平衡二叉树排序的速度均比冒泡排序快,且具有稳定性,但速度不及堆排序、快速排序。冒泡排序是经过 n-1 趟子排序完成的,第 i 趟子排序从第 1 个数至第 n-i 个数,若第 i 个数比后一个数大(则升序,小则降序)则交换两数
for(i=0;i<9;i++)// 外层循环,遍历数组(最后一个数无需比较)
{
for(j=0;j<10-i;j++){// 仍从第一对数开始比较(因为可能由于第 2 个数和第 3 个数的交换,使得第 1 个数不再小于第 2 个数)
// 第一次比较后,最后一个数必是最大的,以后无需与最后一个比较。
// 同理,第二次后,倒数第二个也是第二大的
if(a[j]>a[j+1]){// 如果前者比后者大,交换
k=a[j+1];
a[j+1]=a[k];
a[j]=k;
}
}
————————————————————————此图摘自百度百科