[알고리즘] 퀵정렬

2015. 6. 1. 17:09·java

퀵 소트

퀵소트는 비교정렬의 한 종류이다.

찰스 앤터니 리처드 호어가 개발한 정렬 알고리즘이다.

데이터 양이 크고 섞여 있을 경우 가장 빠른 속도를 낼 수 있다.

 

알고리즘

1. 리스트 가운데서 하나의 원소를 고른다. (이 원소를 피벗이라 한다.)

2. 피벗 앞에는 피벗보다 작은 원소들이 오고, 피벗 뒤에는 큰 원소들이 오도록 피벗을 기준으로 리스트를 둘로 나눈다.

이렇게 피벗의 위치가 정해진다.

3. 피벗의 앞쪽 리스트와 피벗의 뒤쪽 리스트에 대하여 1, 2 를 반복한다.

 

소스코드[Java]

 

package sdk.java.example.sort;

import java.util.Random;

public class QuickSort {

    /**
     * 퀵 소트 처리
     * 
     * @param array
     * @param left
     * @param right
     */
    public void sort(Integer[] array, int left, int right) {

        if(left >= right){
            printArray(array);
            return;
        } 
        
       int low = left + 1; // low 는 left 의 한칸 옆
        int high = right;   // high 는 right 와 동일함
        int pivot = array[left];
        
        while (low <= high) {
            while (low <= right && array[low] <= pivot) {
                low++;
            }

            while (left + 1 <= high && pivot <= array[high]) {
                high--;
            }

            if (low <= high) {
                int temp = array[low];
                array[low] = array[high];
                array[high] = temp;
            } else {
                array[left] = array[high];
                array[high] = pivot;
            }
        }

        sort(array, left, high - 1 );
        sort(array, high + 1, right );
    }

    /**
     * 배열 출력
     * 
     * @param array
     */
    public <E> void printArray(E[] array) {
        for (E value : array) {
            System.out.print(value);
            System.out.print(" ");
        }
        System.out.println("");
    }
    
    /**
     * 무작위 Int 배열 생성
     * 
     * @param capacity
     * @param randomBound
     * @return
     */
    public Integer[] initArray(int capacity, int randomBound) {
        Integer[] array = new Integer[capacity];
        Random random = new Random();
        for (int i = 0; i < capacity; i++)
            array[i] = random.nextInt(randomBound);
        
        return array;
    }

    public static void main(String[] args) {

        int capacity = 10;
        int randomBound = 100;
        QuickSort quick = new QuickSort();
        
        // 정렬 대상 생성
        Integer[] array = quick.initArray(capacity, randomBound);
        quick.printArray(array);
        
        System.out.println("------------ start -------------");
        
        quick.sort(array, 0, array.length - 1);
    }
}

 

참고

http://navercast.naver.com/contents.nhn?rid=2871&contents_id=90163

반응형
저작자표시 비영리 (새창열림)

'java' 카테고리의 다른 글

[Math] 좌표계의 x, y를 이용한 각도 구하기  (0) 2016.05.19
[개념] 스택(stack)과 힙(heap)  (0) 2016.02.16
[JDK8] Date, Calendar, LocaDateTime 날자 관련 객체들 사용법  (0) 2015.06.09
[어노테이션] 어노테이션과 리플렉션을 이용한 메소드 실행시간 출력하기  (0) 2015.06.04
MSSQL 에서 Oracle 에 있는 테이블로 정보를 insert 프로그램  (0) 2013.02.05
'java' 카테고리의 다른 글
  • [개념] 스택(stack)과 힙(heap)
  • [JDK8] Date, Calendar, LocaDateTime 날자 관련 객체들 사용법
  • [어노테이션] 어노테이션과 리플렉션을 이용한 메소드 실행시간 출력하기
  • MSSQL 에서 Oracle 에 있는 테이블로 정보를 insert 프로그램
hs_seo
hs_seo
Hello World!
    반응형
  • hs_seo
    개발자로 살아남기
    hs_seo
  • 전체
    오늘
    어제
    • 전체 (1140)
      • 개발자 (21)
        • 개발에 유의할 점 (0)
        • 면접 (5)
      • IT 소식 (5)
        • 업계 (1)
      • java (51)
        • 디자인패턴 (3)
        • apache-common (1)
      • 개념 (47)
        • 자료구조 (4)
        • 함수형사고 (8)
        • 디자인패턴 (1)
      • 데이터분석 (1)
      • python (67)
        • 코드조각 (12)
        • 라이브러리 (2)
      • 빅데이터 (418)
        • zookeeper (5)
        • hadoop (78)
        • hdfs (12)
        • hive (127)
        • hbase (16)
        • spark (40)
        • scala (4)
        • trino (3)
        • oozie (41)
        • Hue (9)
        • R (5)
        • sqoop (6)
        • flume (3)
        • elasticsearch (2)
        • airflow (16)
        • kafka (3)
        • kubernetes (10)
        • openstack (3)
        • flink (2)
        • redis (2)
      • 빅데이터 강좌 (2)
      • 알고리즘 (131)
        • 알고리즘 (1)
        • 백준 (61)
        • 정올 (41)
        • 더블릿 (5)
        • 프로그래머스 (1)
      • 프로그래밍 언어 (30)
        • go (4)
        • js (9)
        • .Net (6)
        • Jsp (1)
        • ansible (3)
        • terraform (6)
      • Tools (56)
        • docker (2)
        • macbook (6)
        • maven (3)
        • sublime (1)
      • 프레임워크 (25)
        • [JS] angularjs (2)
        • [JS] node.js (19)
        • [Java] spring (2)
        • Android (2)
      • 데이타베이스 (43)
        • SQLD (5)
        • Oracle (1)
        • MySQL (8)
        • ADsP (2)
      • 리눅스 (25)
        • Bash (61)
      • GCP (5)
      • AWS (34)
        • EC2 (2)
        • EMR (14)
      • 정보보안기사 (4)
        • 네트워크 (1)
      • 개인 (80)
        • 업무실수 (0)
        • 책 (9)
        • 교육 (3)
        • 여행 (17)
        • 영화 (12)
        • 음악 (2)
        • 피규어 (4)
        • 게임 (3)
        • 생각 (7)
        • 기타 (10)
        • 좋은글 (5)
        • 좋은 사이트 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

    • 빅데이터-하둡,하이브로 시작하기
    • 빅데이터-스칼라, 스파크로 시작하기
    • Kaggle에서 파이썬으로 데이터 분석 시작하기
    • 쉘스크립트 개발 시작하기
    • 개발자가 데이터 분석 준전문가 되기
    • 데브쿠마
  • 공지사항

  • 인기 글

  • 태그

    오류
    build
    error
    airflow
    nodejs
    oozie
    emr
    bash
    java
    S3
    HIVE
    Hadoop
    mysql
    k8s
    Tez
    하둡
    알고리즘
    정올
    백준
    Python
    하이브
    AWS
    다이나믹
    Linux
    SPARK
    HDFS
    hbase
    yarn
    파이썬
    ubuntu
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
hs_seo
[알고리즘] 퀵정렬
상단으로

티스토리툴바