Skip to content

Commit a8069fa

Browse files
committed
first commit
0 parents  commit a8069fa

File tree

5 files changed

+174
-0
lines changed

5 files changed

+174
-0
lines changed

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
*.o
2+
*.*.bak
3+
/.idea
4+
algorithmDemo.iml
5+
/target
6+
/out

pom.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>org.lhn</groupId>
8+
<artifactId>AlgorithmDemo</artifactId>
9+
<version>1.0-SNAPSHOT</version>
10+
11+
12+
</project>
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package org.lhn.insertionsort;
2+
3+
import org.lhn.util.SortTestTools;
4+
5+
/**
6+
* Created With IntelliJ IDEA
7+
* User: LiHaiNan
8+
* Date: 2016/12/26 0026
9+
* Time: 下午 5:23
10+
* 插入排序算法O(n^2) 级别的
11+
*/
12+
public class InsertionSort {
13+
14+
//理论上说:插入排序比选择排序效率要高,因为插入排序可以提前结束循环查找,但真的是如此吗?
15+
//其实并不是,因为在比较的同时,他还在不停地执行SortTestTools.swap(arr,j,j-1);交换,交换要比比较更加耗时。
16+
//改进版,使其在内层循环中只交换一次
17+
public static void main(String[] args) {
18+
System.out.println("**程序开始排序**");
19+
int n = 1000;
20+
int[] arr = SortTestTools.randomArrayForInt(n, 100, n);
21+
long startTime = System.currentTimeMillis();
22+
insertionSort(arr, n);
23+
long endTime = System.currentTimeMillis();
24+
SortTestTools.printArray(arr);
25+
System.out.println("算法耗时:【" + (endTime - startTime) + "】毫秒");
26+
}
27+
28+
//插入排序
29+
/*
30+
* 看当前位置的数比它前一个位置的数小,如果小就与前面的数交换位置,
31+
*以此类推
32+
*/
33+
public static void insertionSort(int[] arr, int n) {
34+
//对于插入排序来说,数组的第一个位置的数默认是有序的
35+
for (int i = 1; i < n; i++) {
36+
//寻找元素arr[i]合适的插入位置,这里使用j>0而不是j>=0是因为每一次都是把
37+
//当前位置的元素和前一个位置的元素进行交换,所以最后发生的位置是j=1的时候
38+
for (int j = i; j > 0 && (arr[j]<arr[j - 1]); j--) {
39+
//考察的是当前元素是否比前一个元素的值要小,yes交换位置
40+
SortTestTools.swap(arr, j, j - 1);
41+
}
42+
}
43+
}
44+
45+
//插入排序在数据有序性越强的情况下,效率越高,它会趋向于O(n)
46+
public static void insertionSortPro(Integer[] arr, int n) {
47+
//使其在内层循环只交换一次
48+
for (int i = 1; i < n; i++) {
49+
//先把要考察的当前元素由e来保存一个副本
50+
Integer e = arr[i];
51+
int j;//j保存元素应该插入的位置
52+
//如果arr[j - 1] > e说明不是我们要找的最终位置
53+
for (j = i; j > 0 && e.compareTo(arr[j - 1])<0; j--) {
54+
//向后移位
55+
arr[j] = arr[j - 1];
56+
}
57+
arr[j] = e;
58+
}
59+
}
60+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package org.lhn.selectionsort;
2+
3+
import org.lhn.util.SortTestTools;
4+
5+
/**
6+
* Created With IntelliJ IDEA
7+
* User: LiHaiNan
8+
* Date: 2016/12/26 0026
9+
* Time: 下午 5:23
10+
* 选择排序算法O(n^2) 级别的
11+
*/
12+
public class SelectionSort {
13+
14+
public static void main(String[] args) {
15+
System.out.println("**程序开始排序**");
16+
int n = 1000;
17+
int[] arr = SortTestTools.randomArrayForInt(n, 100, n);
18+
long startTime = System.currentTimeMillis();
19+
selectionSort(arr, n);
20+
long endTime = System.currentTimeMillis();
21+
SortTestTools.printArray(arr);
22+
System.out.println("算法耗时:【" + (endTime - startTime) + "】毫秒");
23+
}
24+
25+
//选择排序
26+
/*
27+
* 1.在整个数组中找出最小数的位置minIndex
28+
* 2.将最小数与第一名的位置交换
29+
* 3.检索之后的最小数的位置并与第二名的位置交换,以此类推实现排序
30+
* */
31+
32+
//int arr[]要排序的数组,int n 数组大小
33+
public static void selectionSort(int[] arr, int n) {
34+
for (int i = 0; i < n; i++) {
35+
//遍历数组,寻找[i,n)区间里的最小值
36+
int minIndex = i;
37+
//注意:是在数组的第二个位置进行检索,并不是从头开始检索,因为minIndex初始化的为第一个
38+
for (int j = i + 1; j < n; j++) {
39+
if (arr[j] < arr[minIndex]) {
40+
//判断当前索引位置的值是否小于最小值
41+
minIndex = j;
42+
}
43+
}
44+
//与第一交换位置
45+
SortTestTools.swap(arr, i, minIndex);
46+
}
47+
}
48+
49+
50+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.lhn.util;
2+
3+
import java.util.Random;
4+
5+
/**
6+
* Created With IntelliJ IDEA
7+
* User: LiHaiNan
8+
* Date: 2016/12/26 0026
9+
* Time: 下午 5:23
10+
* ProjectName: sort
11+
* 生成排序数据集
12+
*/
13+
public class SortTestTools {
14+
15+
// 生成有n个元素的随机数组,每个元素的随机范围为[rangeL,rangeR]
16+
public static int[] randomArrayForInt(int n,int rangeL,int rangeR){
17+
int[] arr= new int[n];
18+
Random random=new Random();
19+
for (int i=0;i<n;i++){
20+
/*
21+
* random.nextInt(max)表示生成[0,max]之间的随机数,然后对(max-min+1)取模。
22+
* 以生成[10,20]随机数为例,首先生成0-20的随机数,然后对(20-10+1)取模得到
23+
* [0-10]之间的随机数,然后加上min=10,最后生成的是10-20的随机数
24+
* */
25+
arr[i]= random.nextInt(rangeR)%(rangeR-rangeL+1)+rangeL ;
26+
}
27+
return arr;
28+
}
29+
30+
31+
//打印arr数组的所有内容
32+
public static void printArray(int[] arr){
33+
for (int i=0;i<arr.length;i++){
34+
System.out.print(arr[i]+" ");
35+
}
36+
System.out.println();
37+
}
38+
39+
//位置交换
40+
//将下标为i的与下标为j的进行位置交换
41+
public static void swap(int[] a, int i, int j) {
42+
int temp = a[i];
43+
a[i] = a[j];
44+
a[j] = temp;
45+
}
46+
}

0 commit comments

Comments
 (0)