package sort;
public class Test1insert {
/**
* 插入排序
*/
public static void main(String[] args) {
Integer[] array = new Integer[] { 1, 3, 1, 4, 2, 4, 2, 3, 2, 4, 7, 6, 6, 7, 5, 5, 7, 7 };
/*for (int i = 0; i < array.length; i++) {
for (int j = i; j>0; j--) {
if(array[j].compareTo(array[j-1])<0){
int min=j-1;
swap(array,j,min);
}
}
}
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}*/
int n = array.length;
for (int i = 0; i < n; i++)
{
int min = i;
//从第i+1个元素开始,找最小值
for (int j = i + 1; j < n; j++)
{
if (array[min].compareTo(array[j]) > 0)
min = j;
}
//找到之后和第i个元素交换
swap(array, i, min);
}
}
private static void swap(Integer[] array, int j, int min) {
int temp =array[min];
array[min]=array[j];
array[j]=temp;
}
}
package sort;
public class Test {
public static void main(String[] args) {
Integer[] array = new Integer[] { 1, 3, 1, 4, 2, 4, 2, 3, 2, 4, 7, 6, 6, 7, 5, 5, 7, 7 };
/**
* 希尔排序
* 希尔排序也称之为递减增量排序,他是对插入排序的改进。在第二部插入排序中,
* 我们知道,插入排序对于近似已排好序的序列来说,
* 效率很高,可以达到线性排序的效率。但是插入排序效率也是比较低的,
* 他一次只能将数据向前移一位。比如如果一个长度为N的序列,最小的元素如果恰巧在末尾
* ,那么使用插入排序仍需一步一步的向前移动和比较,要N-1次比较和交换。
希尔排序通过将待比较的元素划分为几个区域来提升插入排序的效率。
这样可以让元素可以一次性的朝最终位置迈进一大步,然后算法再取越来越小的步长进行排序,
最后一步就是步长为1的普通的插入排序的,但是这个时候,整个序列已经是近似排好序的,所以效率高。
*/
int n= array.length;
int h=1;//步长
while(h<n/3)
//System.out.println(h);
h=h*3+1;
// System.out.println(h);
while(h>=1){
System.out.println(h);
/// System.out.println("++++++++++++++++++");
for(int i=0;i<n;i++){
/* System.out.println(""+i);
System.out.println("aaaa");*/
for(int j=i;j>=h;j=j-h ){
//System.out.println(""+(j-h));
if(array[j].compareTo(array[j-h])<0){
System.out.println("---------------"+(j-h));
swap(array,j,j-h);
// System.out.print(array[i]);
}else{
break;
}
}
}
h=h/3;
}
/* for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}*/
}
private static void swap(Integer[] array, int i, int min)
{
Integer temp = array[i];
array[i] = array[min];
array[min] = temp;
}
}
public class Test {
public static void main(String[] args) {
Integer[] array = new Integer[] { 1, 3, 1, 4, 2, 4, 2, 3, 2, 4, 7, 6, 6, 7, 5, 5, 7, 7 };
/**
* 希尔排序
* 希尔排序也称之为递减增量排序,他是对插入排序的改进。在第二部插入排序中,
* 我们知道,插入排序对于近似已排好序的序列来说,
* 效率很高,可以达到线性排序的效率。但是插入排序效率也是比较低的,
* 他一次只能将数据向前移一位。比如如果一个长度为N的序列,最小的元素如果恰巧在末尾
* ,那么使用插入排序仍需一步一步的向前移动和比较,要N-1次比较和交换。
希尔排序通过将待比较的元素划分为几个区域来提升插入排序的效率。
这样可以让元素可以一次性的朝最终位置迈进一大步,然后算法再取越来越小的步长进行排序,
最后一步就是步长为1的普通的插入排序的,但是这个时候,整个序列已经是近似排好序的,所以效率高。
*/
int n= array.length;
int h=1;//步长
while(h<n/3)
//System.out.println(h);
h=h*3+1;
// System.out.println(h);
while(h>=1){
System.out.println(h);
/// System.out.println("++++++++++++++++++");
for(int i=0;i<n;i++){
/* System.out.println(""+i);
System.out.println("aaaa");*/
for(int j=i;j>=h;j=j-h ){
//System.out.println(""+(j-h));
if(array[j].compareTo(array[j-h])<0){
System.out.println("---------------"+(j-h));
swap(array,j,j-h);
// System.out.print(array[i]);
}else{
break;
}
}
}
h=h/3;
}
/* for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}*/
}
private static void swap(Integer[] array, int i, int min)
{
Integer temp = array[i];
array[i] = array[min];
array[min] = temp;
}
}