选择排序
算法思想
首先找到最小的元素,让它和数组的第一个元素交换位置,然后在剩下的元素中找到最小的和数组的第二个元素交换位置,如此往复,直到将整个数组排好序。
算法分析
这里规定数组的长度为N
- N次交换:外层每循环一次都要进行交换
- N2/2次比较:0到N-1的任意元素都会N-1-i次比较,所以比较次数为(N-1)+(N-2)+…+2+1=N(N-1)/2~N2
- 特点:运行时间与输入无关(即使输入一个有序数组运行还是没有改变);数据移动是最少的(j交换次数和数组大小是线性关系)
算法代码
public static void sort(int[] a){
int N=a.length; //数组的长度
for(int i =0;i<N;i++){
int min=i; //最小元素的索引
for(int j=i+1;j<N;j++){
if(a[j]<a[min]) //元素小于min索引处的元素时,将此元素位置赋值给索引
min=j;
}
//交换a[i]和a[min]
int t =a[i];
a[i]=a[min];
a[min]=t;
}
}
插入排序
算法思想
拿出一个数,与有序数列比较,插入到适当位置,插入时将其余元素在插入之前都向右移动一位,给插入元素腾出位置。对于一个待排序的数列,我们从第二个元素开始作为索引,默认将第一个元素作为有序序列,索引元素左边的序列始终为有序序列,然后将索引元素插入到左边有序列的合适位置,直到索引达到数组最右端,排序结束。
算法分析
这里规定数组长度为N,需要得到升序排列的数组
- 最坏情况(输入的数组为降序):每一次待插入元素都要和前面的有序序列的每一个元素进行比较切交换,比较次数为:1+2+3+…+N-1=N(N-1)/2~N2/2,交换次数也为N2/2
- 最好情况(输入的数组为升序):N-1次比较,0次交换
算法代码
public static void sort(int[] a){
int N=a.length; //数组长度
for(int i=1 ; i<N;i++){
for(int j=i;j>0&&a[j]<a[j-1];j--){
//比较,待插入元素比前面的元素小时交换
int t= a[j];
a[j]=a[j-1];
a[j-1]=t;
}
}
}
本文详细介绍了两种经典的排序算法——选择排序和插入排序。选择排序通过不断寻找最小元素并将其放到正确的位置来完成排序。而插入排序则是通过将每个元素插入到已排序序列的正确位置来实现排序。

2万+

被折叠的 条评论
为什么被折叠?



