内部排序:
稳定的排序算法: 冒泡排序、插入排序、基数排序、归并排序
不稳定的排序算法: 选择排序、希尔排序、堆排序、快速排序
外部排序: 基本原理是归并排序
选择排序
要求:从小到大排序
算法思想:
①输入并用数组存储N个数据,
②令 i=0,从i向N-1依次遍历;
③对于每一个i,令j=i+1,自j向N依次遍历;如果a[i]>a[j],交换a[i]、a[j]的值;
④i遍历结束时(排序完成),END。
示例数据: 23 19 34 12 34 12 0 -3
排序过程:
i=0时,j=i:7;
23 19 34 12 34 12 0 -3 首先选中23、19;因为23>19;交换23与19
19 23 34 12 34 12 0 -3 选中19、34;因为19<34;继续
19 23 34 12 34 12 0 -3 ……
12 23 34 19 34 12 0 -3 ……
12 23 34 19 34 12 0 -3 ……
12 23 34 19 34 12 0 -3
0 23 34 19 34 12 12 -3
-3 23 34 19 34 12 12 0 END
至此,i=0这一趟已经完成,成功的把最小值-3移到数组的最左边。之后各趟的操作与此类似,不再赘述。
代码:
#include<stdio.h>
int main(void)
{
int a[200],tmp;
int n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[i]>a[j]){
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
for(i=0;i<n;i++)
printf("%d\t",a[i]);
return 0;
}复杂度分析:
时间复杂度:
当数据无序时,平均情况:O(N^2)
最坏情况:O(N^2)
当数据已经是顺序排列时,存在最优时间:O(N)
空间复杂度分析: o(1)
冒泡排序
要求:从小到大排序
算法思想:
①输入并用数组存储N个数据,
②令 i=0,从i向N-1依次遍历;
③对于每一个i,令j=0,自j向N-i-1依次遍历;如果a[j]>a[j+1],交换a[j]、a[j-1]的值;
④i遍历结束时(排序完成),END。
示例数据: 23 19 34 12 34 12 0 -3
排序过程:
i=0时,j=i:7;
23 19 34 12 34 12 0 -3 选中23、1;因为23>19,所以交换23与19
19 23 34 12 34 12 0 -3 选中23、34;因为23<34,所以继续
19 23 34 12 34 12 0 -3 选中34、12;因为34>12,交换34与12
19 23 12 34 34 12 0 -3 选中34、34;因为34==34,所以继续
19 23 12 34 34 12 0 -3 选中34、12;因为34>12,交换34与12
19 23 12 34 12 34 0 -3 选中34、0;因为34>0,交换34与0
19 23 12 34 12 0 34 -3 选中34、-3;因为34>-3,交换34和-3
19 23 34 19 34 0 -3 34 END
至此,i=0这一趟已经完成,成功的把最大值34移到数组的最右边;。之后的操作与此类似,不再赘述。
核心代码:
for(i=0;i<n-1;i++)
for(j=0;j+1<n-i;j++)
if(a[j]>a[j+1]) {
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}算法分析:
空间复杂度分析:O(1)
时间复杂度分析:
最坏情况:O(N^2)
平均情况:O(N^2)
最优情况:O(N)
插入排序:
要求:从小到大排序
算法思想:
①输入并用数组存储N个数据,令 i=1
②令tmp=a[i],从i向N-1依次遍历;
③对于每一个i,令j=i,自 j 向 1 依次遍历;如果 j-1>=0 且 a[j-1]>tmp,令a[j]=a[j-1];循环结束后,令a[j]=tmp;
④如果i<N-1;i+=1;返回②;
⑤i遍历结束时(排序完成),END。
示例数据: 23 19 34 12 34 12 0 -3
排序过程:
i=0时,j=i:7;
23 19 34 12 34 12 0 -3
19 23 34 12 34 12 0 -3
19 23 34 12 34 12 0 -3
12 19 23 34 34 12 0 -3
12 19 23 34 34 12 0 -3
12 12 19 23 34 34 0 -3
0 12 12 19 23 34 34 -3
-3 0 12 12 19 23 34 34
至此,i=0这一趟已经完成,成功的把最大值34移到数组的最右边;。之后的操作与此类似,不再赘述。
核心代码:
for(i=1;i<n;i++){
tmp=a[i];
for(j=i;j-1>=0 && a[j-1]>tmp;j--)
a[j]=a[j-1];
a[j]=tmp;
}算法分析:
空间复杂度分析:O(1)
时间复杂度分析:
最坏情况:O(N^2)
平均情况:O(N^2)
最优情况:O(N)
原文:http://executer.blog.51cto.com/10404661/1732591