1 冒泡排序
/**
* 冒泡排序 说明:从第一个开始,和后面的每个数进行比较,保证第一个 位置的数在第一个位置开始是最小的,第二位置的数和后面的比较,保证
* 第二个位置的数在第二开始是最小的,后面依次类推 从另外一个角度讲就是取最小的数放在第一个位置,取第二小的数放在第二个位置,后面依次类推
*
* @param data
* 被排序的数组
*/
public static void bubbleSort(Integer[] data) {
for (int i = 0; i < data.length; i++) {
for (int j = i + 1; j < data.length; j++) {
if (data[i] > data[j]) {
// 数据互换,保证data[i]不大于data[j]
Integer temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
}
}
2 直接插入排序
直接插入排序类似打扑克牌,将每一张扑克牌插入到已经排好序的牌组中。
图解如下:
图片摘自:
http://www.cnblogs.com/MOBIN/p/4679208.html
/**
* 直接插入排序 数据从索引1开始。
* 说明:整理手中扑克牌顺序的过程。将一张牌插入已经排好序的牌组中,在牌组中找到合适的位置,被排序中数据的索引从1开始,防止出现数组越界。
*
* @param data
*/
public static void insertSort(Integer[] data) {
// 索引为0存储临时数据,从第三个数开始进行插入合适的位置
for (int i = 2; i < data.length; i++) {
data[0] = data[i];// 存储被比较的元素
// 从已排好序最后位置开始向前推,找到合适的位置插入
for (int j = i; j >= 1; j--) {
if (data[j] < data[0]) {
data[j + 1] = data[0];// 从后往前,插入数据大于索引第j,说明应该插入j+1的位置,
//而索引j位置的数据与j+1的数据相同,此时插入j+1的位置
break;
} else {
data[j] = data[j - 1];// 不满足条件,则将数据后移
}
}
}
// 输出排好序的序列
for (int i = 1; i < data.length; i++) {
System.out.print(data[i] + " ");
}
}
教材中通俗易懂的代码:
public static void insertSort_01(Integer[] data) {
for (int i = 2; i < data.length; i++) {
data[0] = data[i];
int j;
for (j = i - 1; data[0] < data[j]; j--) {//找到插入的位置,应该插入到j+1的位置
data[j + 1] = data[j];
}
data[j + 1] = data[0];
}
//输出排好序的序列
for (int i = 1; i < data.length; i++) {
System.out.print(data[i]+" ");
}
}
3 快速排序
快速排序:快速排序的中心想法就是找到轴值的最终位置(使其左边的数都小于轴值,右边的数大于轴值),在选择轴值的过程中,保证轴值的左右满足一定的规律左边的数小于轴值,而右边的数大于轴值。然后再从轴值的两边再次选择轴值,与上类似。假设设置两个哨兵,即一个i,一个j,其实哨兵j的使命就是要找小于基准数的数,而哨兵i的使命就是要找大于基准数的数,直到i和j碰头为止。
最差时间复杂度和冒泡排序是一样的都是O(N2),平均时间复杂度为O(NlogN)
参考博客:http://developer.51cto.com/art/201403/430986.htm
/**
* 选择轴值。 说明:在找轴值的过程中,扫描右边的数下于轴值,则说明右侧的数不满足轴值两边数据规则,
* 即左边的数小于轴值,而右边的数大于轴值。需交换。再扫描左侧也同理。也可从这方面理解,通过不停的 比较,保证了轴值两侧的规则。
*
* @param data
* 被排序的数据
* @param startIndex
* 起始区间
* @param endIndex
* 结束区间
* @return 返回轴值
*/
public static void quickSort(Integer[] data, Integer startIndex,
Integer endIndex) {
if (startIndex < endIndex) {
Integer position = position(data, startIndex, endIndex);
quickSort(data, position + 1, endIndex);
quickSort(data, startIndex, position - 1);
}
}
public static int partition(int[] data, int first, int end) {
int i = first;
int j = end;
while (i < j) {
// 右侧扫描
while (i < j && data[i] < data[j]) {
j--;
}
if (i < j) {
// 交换
int temp = data[i];
data[i] = data[j];
data[j] = temp;
i++;
}
// 左侧扫描
while (i < j && data[i] < data[j]) {
i++;
}
if (i < j) {
// 交换
int temp = data[i];
data[i] = data[j];
data[j] = temp;
j--;
}
}
return i;
}
输入输出:
Scanner sc = new Scanner(System.in);
//int age = sc.nextInt(); //读取整型输入
String str=sc.next();//获取String类型
System.out.println(str);