1选择排序:
常用的选择排序有直接选择排序和堆排序两种。堆排序是一种基于完全二叉树的排序。
package cn.ls.sort;
/**
*
*选择排序之直接选择排序。
*/
public class MySelectSort {
public static void main(String[] args) {
int[] array = {64, 7, 5, 89, 6, 24, 5};
//直接选择排序中第1次排序要进行n-1次比较,第2次排序要进行n-2次比较...
//比较次数 = (n-1)+(n-2)+...+1 = n(n-1)/2.
SelectSort(array);
for (int i=0; i<array.length; i++){
System.out.print(array[i]+" ");
}
}
/**
* 直接选择排序
* @param array
*/
private static void SelectSort(int[] array) {
int x,y,small;
for( x = 0; x<array.length-1; x++){
small = x;
for (y = x+1; y<array.length; y++){
if (array[small]>array[y]) small = y;//记录最小下标值.array[y]要和先前最小元素进行比较.
}
if(small != x){
//交换.注意:交换可能引起相同数据元素位置发生变化.
//swap(array, x, small);
//错位赋值可以保证排序算法的稳定性.
int temp = array[small];
for (y=small; y>x; y--){
array[y] = array[y-1];//把该区尚未排序的数值依次后移.
}
array[x] = temp;
}
}
}
private static void swap(int[] array, int x, int small) {
int temp = array[x];
array[x] = array[small];
array[small] = temp;
}
}
2交换排序:
常用的交换排序方法有冒泡排序和快速排序。快速排序是一种分区交换排序方法。
package cn.ls.sort;
/**
*
*交换排序之冒泡排序.
*/
public class MyBubbleSort {
public static void main(String[] args) {
int[] array = {5, 64, 7, 89, 6, 24};
bubbleSort(array);
//输出结果.
for (int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
}
/**
*
*冒泡排序:内循环结束一次,最值出现在末角标位。是一种稳定的排序方法。
相邻两个元素比较。
*/
private static void bubbleSort(int[] array) {
int flag = 1;//flag变量,如果数据已全部排好,则提前结束排序。
for (int x= 0; x<array.length-1 && flag == 1; x++){
flag = 0;
for (int y=0; y<array.length-1-x; y++){//-1:避免角标越界,-x:减少参与比较的元素。
if (array[y]>array[y+1]){
flag = 1;
swap(array, y);
}
}
}
}
/**
* 交换数据元素.
* @param array
* @param y
*/
private static void swap(int[] array, int y) {
int temp = array[y];
array[y] = array[y+1];
array[y+1] = temp;
}
}