package Test1;
public class SortDemo {
/**
* 冒泡排序 数组角标从前往后走,大的数往后走1.
* 基本思想:两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,
* 直到没有反序的数据元素为止。
* @param arr 待排序数组
*
*/
public static void Bubble(int[] arr){
for(int i=1;i<arr.length;i++){
for(int j=0;j<arr.length-i;j++){
if(arr[j]>arr[j+1]){//
//换位
swap(arr,j,j+1);
}
}
}
}
/**
* 冒泡排序第二种方法 数组角标从后往前遍历,小的数往前跑
* @param arr
*/
public static void Bubble2(int[] arr){
//两两比较,外围循环为长度减1
for(int i=0;i<arr.length-1;i++){
for(int j=arr.length-1;j>i;j--){
if(arr[j]<arr[j-1])
swap(arr,j,j-1);
}
}
}
/**
* 选择排序。基本思想:两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,
* 直到没有反序的数据元素为止。
* @param arr
*/
public static void select (int[] arr){
int min;//最小索引
for(int i=0;i<arr.length-1;i++){
min =i;//假设没轮的第一个元素师最小元素
//从假设的最小元素的下一元素开始循环
for(int j=i+1;j<arr.length;j++){
if(arr[min]>arr[j]){
min=j;
}
}
swap(arr,i,min);
}
}
/**插入排序,从小到大顺序排列
* 基本思想:每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置
* 使数列依然有序;直到待排序数据元素全部插入完为止。
* @param arr
*/
public static void InsertSort(int[] arr){
for(int i=0;i<arr.length-1;i++){
//待插入的元素
int insertElem = arr[i+1];
for(int j=0;j<i+1;j++){
//找到第一个比待插入元素insertElem大的数
if(insertElem < arr[j]){
//j位后已有序元素往后移动一位
for(int x=i+1;x>j;x--){
arr[x]=arr[x-1];
}
//在j位插入insertElem
arr[j]=insertElem;
break;
}
}
}
}
/**
* 数组中两个元素交换位置
* @param arr
* @param x
* @param y
*/
public static void swap(int[] arr,int x,int y){
int temp = arr[x];
arr[x]=arr[y];
arr[y]=temp;
}
/**
* 打印数组
* @param arr
*/
public static void sop(int[] arr){
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
public static void main(String[] args) {
int[] arr = new int[]{5,2,1,22,14,7,9};
//冒泡排序
//Bubble(arr);
//选择排序
//select(arr);
//插入排序
InsertSort(arr);
sop(arr);
}
}
package Test1;
public class SortDemo {
/**
* 冒泡排序 数组角标从前往后走,大的数往后走1.
* 基本思想:两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,
* 直到没有反序的数据元素为止。
* @param arr 待排序数组
*
*/
public static void Bubble(int[] arr){
for(int i=1;i<arr.length;i++){
for(int j=0;j<arr.length-i;j++){
if(arr[j]>arr[j+1]){//
//换位
swap(arr,j,j+1);
}
}
}
}
/**
* 冒泡排序第二种方法 数组角标从后往前遍历,小的数往前跑
* @param arr
*/
public static void Bubble2(int[] arr){
//两两比较,外围循环为长度减1
for(int i=0;i<arr.length-1;i++){
for(int j=arr.length-1;j>i;j--){
if(arr[j]<arr[j-1])
swap(arr,j,j-1);
}
}
}
/**
* 选择排序。基本思想:两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,
* 直到没有反序的数据元素为止。
* @param arr
*/
public static void select (int[] arr){
int min;//最小索引
for(int i=0;i<arr.length-1;i++){
min =i;//假设没轮的第一个元素师最小元素
//从假设的最小元素的下一元素开始循环
for(int j=i+1;j<arr.length;j++){
if(arr[min]>arr[j]){
min=j;
}
}
swap(arr,i,min);
}
}
/**插入排序,从小到大顺序排列
* 基本思想:每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置
* 使数列依然有序;直到待排序数据元素全部插入完为止。
* @param arr
*/
public static void InsertSort(int[] arr){
for(int i=0;i<arr.length-1;i++){
//待插入的元素
int insertElem = arr[i+1];
for(int j=0;j<i+1;j++){
//找到第一个比待插入元素insertElem大的数
if(insertElem < arr[j]){
//j位后已有序元素往后移动一位
for(int x=i+1;x>j;x--){
arr[x]=arr[x-1];
}
//在j位插入insertElem
arr[j]=insertElem;
break;
}
}
}
}
/**
* 数组中两个元素交换位置
* @param arr
* @param x
* @param y
*/
public static void swap(int[] arr,int x,int y){
int temp = arr[x];
arr[x]=arr[y];
arr[y]=temp;
}
/**
* 打印数组
* @param arr
*/
public static void sop(int[] arr){
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
public static void main(String[] args) {
int[] arr = new int[]{5,2,1,22,14,7,9};
//冒泡排序
//Bubble(arr);
//选择排序
//select(arr);
//插入排序
InsertSort(arr);
sop(arr);
}
}