본문 바로가기

Programming/JAVA

Sort 알고리즘(삽입정렬)

데이터 개수가 적거나 반정도 정렬된 상태나 정렬된 상태에서는 수행속도 양호,  그러나 역순인 경우에는 선택 정렬보다 떨어진다.

자료의 개수 N이 2배 증가하면 소요시간은 대략 2의제곱배씩 증가한다.(정렬알고리즘이 이중루프)

삽입정렬은 자료 상태에 따라 수행속도가 민감하게 차이가 난다.

정렬된 상태가 최선의 상태이며 역순상태가 최악의 상태이다. 이경우 비교 및 이동횟수는 1+2+3+…+n-1로서 n(n-1)/2이다. 최선의 상태에서는 이동은 한번도 일어나지 않으며 비교만 n(n-1)/2번 일어난다.
(n이 5이면 비교는 1+2+3+4번 일어난다.)
평균 연산 시간은 O(n2)


아래의 예제를 참조하자...

-----------------------------------------
링크드리스트를 이용한 방법
-----------------------------------------
class SNode {
public String key;
public Object obj;
public SNode next;
public SNode (String key) {
this(key, null, null);
}
public SNode (String key, Object obj) {
this(key, obj, null);
}
public SNode (String key, Object obj, SNode next) {
this.key = key;
this.obj = obj;
this.next = next;
}
public int compareTo(SNode node) {
if (key.compareTo(node.key)<0) return -1;
else if (key.compareTo(node.key)==0) return 0;
else return 1;
}
}

class Person {
String name;
String tel;
Person(String name, String tel) {
this.name = name;
this.tel = tel;
}
}



public class InsertionSort {
static? 가리킴)
SNode prev;         //삽입되는 위치의 앞, 뒤 포인터
end = head;
while(end.next!= null) {
q = end.next;  /sp;순서를 바꾼다...
end.next = q.next;
q.next = head;
head = q;
}
else {
prev = head;
//새로 추가되는 q가 큰 동안에 수행
r> //q를 마지막으로
if (q == prev.next) end = q;  
else {  //삽입될 위치를 찾은 경우 prev 뒤에 q를 삽입
//q가 가운데 들어가br> }

public static void main(String[] args) {
SNode node1 = new SNode("바길동", new Person("바길동","666-6666"), null);
SNode node2 = new SNode("라길동"”役?","111-1111"), null);
SNode node5 = new SNode("나길동", new Person("나길동","222-2222"), null);
SNode node6 = new SNode("다길동", new Person("다길동","333-3333"), nbsp;!= null) {
System.out.println(((Person)(head.obj)).name + "::" + ((Person)(head.obj)).tel);
head = head.next;
}
}
}



----------------------------------------
---------------------------------------------------------------------------
}
}Millis()- startTime) / counter;
System.out.println("[역순 상태 수행시간] " + elapsedTime + "ms");
//-----