package lanqiao;
/**
* 插入排序
* 效率最高
* 冒泡效率最低
* 选择第二
* 实现思路:
* 先从i = 1;开始排序 把a[i]的值给保存起来 避免被覆盖
* 比第i个数和第i-1个数 如果第i个数大于第i - 1个数那么 我们就要把第一个数插入到自己前面的一个位置
* 这个位置在哪呢? 我们让j = i-1;开始比较第j个数与第i个数的大小 要是比i个数大那么他往后移动一个位置 后j--
* 直到不满足这个条件
* @author wangtong
*
*/
public class InsertSort {
public static void main (String[] args) {
int[] a = new int[] {4,3,6,7,2,24,1};
int[] arr = insertSort(a);
for (int temp : arr) {
System.out.println(temp);
}
}
public static int[] insertSort (int[] arr) {
int j = 0;
int temp = 0;
int len = arr.length;
for (int i = 1; i < len; i++) {
if (arr[i] < arr[i-1]) {
//先把这个数给存放起来
temp = arr[i];
// 找的这个数应该插入的位置(就是找到一个比自己小的插入到他的后面) 把 i-1之前比自己大的 数都往后移动一位
for (j = i - 1; j >=0 ; j--) {
if (arr[j] > temp )
arr[j+1] = arr[j];
}
arr[j+1] = temp;
// 这个是会报数组越界的 因为这一句 arr[j] > temp 所以if (j == -1) { 是执行不了的
// for (j = i - 1; arr[j] > temp && j >=0 ; j--) {
// //if (j == -1) {
// // arr[1] = arr[0];
// // arr[0] = temp;
// //}
// arr[j+1] = arr[j];
// }
}
}
return arr;
}
}
package test;
public class Bubble {
public static void main (String[] args) {
int[] a = {25,24,12,76,101,96,28};
sort(a);
for (int i : a) {
System.out.println(i);
}
}
public static int[] sort (int[] a) {
int len = a.length;
//注意: 这个length是7 不是从零开始的
for (int j = 1; j < len; j++) {
for (int i = 0; i < len - j; i++) {
if (a[i] > a[i+1]) {
int temp;
temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
}
return a;
}
}
package lanqiao;
/**
* 快速排序
* 实现思路:
* 每一轮都
* 先取数组的第一个数来作为关键
* 定义两个指针变量 数组的最左边i和最右边j
* 先从右往左检索比key小的放到i的位置在从左往右检索比key大的放到j的位置 如此重复直到 i = j的时候完成一轮
* 然后递归对他的左边部和右半部分调用 直到只比较的那部分数据只有一个 就完成
* 使用递归的调用
* @author wangtong
*
*/
public class QuickSort {
public static void main (String[] args) {
int[] a = new int[] {13,12,74,55,0};
int len = a.length - 1;
sort(a,0,len);
for (int i = 0; i <= len; i++ ) {
System.out.print(a[i] + " ");
}
}
public static int sortUnit (int[] a,int i,int j) {
int key = a[i];
while (i < j) {
//先从后向前 搜索一个比key小的数 因为我们去的key是i 所以i那个位置是空的 我们先去填那个坑
while (a[j] >= key && i < j) {
j --;
}
//找到的这个数放到i的位置(i的位置现在为空)
a[i] = a[j];
//从前往后找比key大的数
while (a[i] <= key && i < j) {
i ++;
}
//把这个数放到j的位置(j的位置现在为空)
a[j] = a[i];
}
//当 = j的时候第一轮排序结束
a[i] = key;
return i;
}
public static void sort (int[] a,int low,int high) {
if (low >= high) {
//这个判断条件 两种情况 我们排序的那部分数组只有一个元素了
// 第一次我们排序的时候输入错误的数了
return;
}
int index = sortUnit(a,low,high);
// 排序左半部分
sort(a,low,index - 1);
// 排序右半部分
sort(a,index + 1,high);
}
}
package lanqiao;
/**
* 选择排序
* 实现思路:
* 从最前面抽出来一个数 来与其他的数来比较要是还有比他小的那么就与最前面的数交换位置
* 那么第一次选出来的就是最小的第二次是次小的 类推
* @author wangtong
*
*/
public class SelectSort {
public static void main (String[] args) {
int[] a = new int[] {13,12,74,55,0};
selectSort(a);
int len = a.length;
for (int i = 0; i < len; i++) {
System.out.print(a[i] + " ");
}
}
public static int[] selectSort(int[] a) {
//注意我们的数组长度是属性而不是一个方法 所以不用加括号
int len = a.length;
int k; // 标记变量 用于指向每轮最小的那个数
for (int i = 0; i < len; i++) {
k = i;//每次拿第i个数来与其他数来比较
for (int j = i; j < len; j++) {
if (a[k] > a[j]) {
k = j; //说明a[j]较小 那么我们就把它拿出来与其他的元素比
// 最终第一轮比过之后我们会让k指向那个最小的数
}
}
// 一轮比下来以后我们把最小那个放在最前面
if (k != i) {//说明k指向的那个数发生了变化所以交换
int temp;
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
}
return a;
}
}