作为一名快毕业了的大四应届生,在找工作的时候体会到的最大的痛就是会算法的人永远比你有优势!!!
学学简单的算法,对自己还是有好处的。
选择排序,顾名思义就是要把元素选择出来进行排序,要选择,肯定就要有比较,这个时候我们的两层for循环就派上用场了。
假设我们要对一个数组a进行排序,我们要定义两个临时变量(替身),一个是为数组中顺序即将发生变化的元素做替身,一个是为了代替数组的下标,首先第一层for,我们要选出数组的第一个元素a[0],用一个临时变量temp代替a[0](temp = a[0]),用临时变量flag代替数组的下标,方便在第二层for中同数组中的其它元素作比较,假设我们要将数组升序排序,那么在第二层for中,如果出现比a[0]小的数,就使temp等于该数的值,同时记录下标的位置,第二层循环结束后,如果temp的值发生改变(下标的位置发生改变),那么我们就让a[0]等于temp,对应改变后的下标的位置处的值等于a[0],这就完成了第一趟排序,之后的第二趟、第三趟只要从a[1]、a[2]开始(由第一层for循环控制),以此类推,这样每次都会选出剩下的数中最小的数放在第i位上,所以叫做选择排序,当第一层for循环进行到数组的最后一个元素时,排序完成。
简单流程为:
int[] a = {54,21,69,23,45};
第一趟排序后元素的顺序为:[21],54,69,23,45
第二趟排序后元素的顺序为:[21],[23],69,54,45
第三趟排序后元素的顺序为:[21],[23],[45],54,69
第四趟排序后元素的顺序为:[21],[23],[45],[54],69
第五趟排序后元素的顺序为:[21],[23],[45],[54],[69]
因未执行到的循环中的数的大小是不可预知的,所以循环会一直执行到最后,选择排序的时间复杂度为O(n²)不变。
代码及测试结果如下:
package pp.suanfa;
/**
* 选择排序
*
* @author Administrator
*
*/
public class chooseSort{
public static void cSort(int a[]){
int temp = 0;
int flag = 0;
for(int i=0;i<a.length;i++)
{
temp = a[i];//取出a[i]的值
flag = i;//取出i的值
for(int j=i+1;j<a.length;j++)
{
if(temp>a[j])//将a[i]与a[i]后面的元素进行比较,若a[i]>a[j]则将a[j]的值取出
{
temp = a[j];
flag = j;
}
}
if(flag!=i)
{
a[flag] = a[i];//此时将a[i]与最终的a[j]值互换
a[i] = temp;
}
}
}
public static void main(String[] args){
int a[] = {35,21,46,15,53};
cSort(a);
for(int i=0;i<a.length;i++)
{
System.out.print(a[i]+" ");
}
System.out.println();
}
}