假设排序数组a[n],按从小到大排列
int a[] = {1,5,3,6,2,4,9,2,0};
int length = a.length;
准备好交换方法
private void swap(int j, int i) { int temp = a[j]; a[j] = a[i]; a[i] = temp; }
排序好后打印
for(int k = 0; k < length;k++){ Log.e("tag",a[k] +""); }
冒泡算法两两比较,实际中会产生很多的交换操作,实际上是可以避免的
这就是简单选择排序
从0到n找到最小的数,再和最左边的数进行交换,这样每一轮只用交换一次
步骤:1.从j=i=0开始,假设a[0]是最小的数,则min = 0
然后让把a[1] 和a[0]比较,如果a[1] < a[0],则min = 1
。。。。
最后把a[n] 和 a[0]比较,如果a[n] < a[0],则min = n
这样完成一轮比较,min为最小数的下标,
a[0]和a[min]进行交换,这样数组中最小的数就被移到了a[0],a[0]排好序
接下来再从j=i=1开始。。。。。
实现方法如下:
for(int i = 0; i < length;i++){ int min = i; for(int j = i+ 1;j < length;j++){ if(a[j] < a[min]){ min = j; } } swap(min,i); }
时间复杂度:(n-1) + (n -2)+(n-3) + 。。。 + 1 = n(n-1)/2 , 即O(n^2)
和冒泡算法一样,但交换次数要比冒泡算法少很多