ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [์•Œ๊ณ ๋ฆฌ์ฆ˜] 07. Sort
    ๐ŸณDev/Algorithm 2021. 11. 25. 16:35

    Insertion Sort

    ์‚ฝ์ž… ์ •๋ ฌ

    : ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์•ž์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ์ด๋ฏธ ์ •๋ ฌ๋ค ๋ถ€๋ถ„๊ณผ ๋น„๊ตํ•˜์—ฌ, ์ž์‹ ์˜ ์œ„์น˜๋ฅผ ์ฐพ์•„ ์‚ฝ์ž…ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

        boolean sort(E[] aList){
          if(aList.length <= 1) return false;
    
          int minLoc = 0;
          for(int i = 1; i < aList.length; i++)
              if(this.compare(aList[minLoc], aList[i]) > 0) minLoc =i;
              this.swap(aList,minLoc,0);
    
              for(int i = 2;i < aList.length; i++){
                  E insertedElement = aList[i];
                  int j = i-1;
                  while(this.compare(aList[j], insertedElement) > 0){
                      aList[j+1] = aList[j];
                      j--;
                  }
                  aList[j+1] = insertedElement;
                }
            return true;
        }
    • Worst ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(n^2)

    Quick Sort

    ํ€ต์ •๋ ฌ

    : pivot์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜์—ฌ, ๋‘๊ฐœ์˜ ๋น„๊ท ๋“ฑํ•œ ํฌ๊ธฐ๋กœ ๋ถ„ํ• ํ•œ ํ›„ ์ •๋ ฌ
    : ์ด๋ฅผ ๋ฐ˜๋ณตํ•˜์—ฌ ์ „์ฒด์ ์œผ๋กœ ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค

     

    1. ํ”ผ๋ด‡์„ ๊ธฐ์ค€์œผ๋กœ ํ”ผ๋ด‡๋ณด๋‹ค ์ž‘์€ ๊ฐ’์€ ์™ผ์ชฝ์—, ํฐ ๊ฐ’์€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ swap
    2. ํ”ผ๋ด‡์„ ๊ธฐ์ค€์œผ๋กœ ๋‘๊ฐœ์˜ ๋ฆฌ์ŠคํŠธ๋กœ ๋ถ„ํ• ํ•œ ํ›„, ์œ„์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณต
    3. ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๊ฐ€ 0์ด๋‚˜ 1์ด ๋ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

     

    • Worst ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(n^2)

     

    ํ‰๊ท ์ ์œผ๋กœ๋Š” O(NlogN)์œผ๋กœ ๊ฐ™์€ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๋Š” ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋น„๊ตํ•  ๋•Œ, ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๋„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ •๋ ฌ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ์— ์ˆ˜ํ–‰์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆฐ๋‹ค. ๋”ฐ๋ผ์„œ pivot์€ ์ค‘๊ฐ„๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

     

        void quickSort(int[] aList, int left, int right) {
          if(left<right){
            int pivot = this.pivot(aList,left,right);
            this.swap(aList,left,pivot);
            E pivotElement = aList[left];
            int toRight = left;
            int toLeft = right+1;
    
            do{
                do{ toRight++;} while(this.compare(aList[toRight],pivotElement)<0);
                do{ toLeft--;} while(this.compare(aList[toLeft],pivotElement)>0);
    
                if(toRight<toLeft)
                  this.swap(aList,toRight,toLeft);
              }while (toRight < toLeft);
    
            this.swap(aList,left,toLeft);
    
            quickSort(aList, left, toLeft - 1);
            quickSort(aList, toLeft + 1, right);
        }
    }

    Heap Sort

    ํž™ ์ •๋ ฌ

    : ์ตœ๋Œ€ ํž™ ๋˜๋Š” ์ตœ์†Œ ํž™์„ ๋งŒ๋“ค์–ด ์ •๋ ฌ

     

    1. ์ •๋ ฌํ•ด์•ผ ํ•  n๊ฐœ์˜ ์š”์†Œ๋ฅผ ์ตœ๋Œ€ ํž™(๋‚ด๋ฆผ์ฐจ์ˆœ)์„ ๋งŒ๋“ฌ
    2. ํž™์—์„œ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด ๋ฐฐ์—ด์˜ ๋’ค๋ถ€ํ„ฐ ์ €์žฅ
    3. ์ตœ๋Œ€ ๊ฐ’๋ถ€ํ„ฐ ์‚ญ์ œ๋˜๋ฏ€๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ

     

    • Heap์€ ์™„์ „์ด์ง„ํŠธ๋ฆฌ์ด๋ฉฐ, 1์ฐจ์› ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„
    • ์ •๋ ฌ์„ ์œ„ํ•ด ๋ฃจํŠธ ๊ฐ’์„ ์‚ญ์ œํ•˜๊ณ , ํ•ด๋‹น ์ž๋ฆฌ์— ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ  ๋‹ค์‹œ ํž™์„ ์žฌ๊ตฌ์„ฑ
    • Worst ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(NlogN)

     

    ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ์€ ์ตœ๋Œ€ ํž™, ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์€ ์ตœ์†Œ ํž™์„ ๊ตฌ์„ฑํ•œ๋‹ค. ์ „์ฒด ์ •๋ ฌ์ด ์•„๋‹ˆ๊ณ , ๊ฐ€์žฅ ํฐ ๊ฐ’์ด ๋ช‡ ๊ฐœ๋งŒ ํ•„์š”ํ• ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๋‹ค.

        private void adjust(E[] aList,int root, int endOfHeap){
            int parent = root;
            E rootElement = aList[root];
            while((parent*2) <= endOfHeap){
                int biggerChild = parent*2;
                int rightChild = biggerChild+1;
                if((rightChild <= endOfHeap)&&(this.compare(aList[biggerChild], aList[rightChild]) < 0))
                    biggerChild = rightChild;
                if(this.compare(rootElement, aList[biggerChild]) >= 0) break;
                aList[parent] = aList[biggerChild];
                parent = biggerChild;
            }
            aList[parent] = rootElement;
        }
    
        private void makeInitHeap(E[] aList){
            for(int rootOfSubtree = (aList.length-1)/2; rootOfSubtree >= 1; rootOfSubtree--){
                this.adjust(aList, rootOfSubtree, aList.length-1);
            }
        }
    
        private E removeMax(E[] aList, int heapSize){
            E removedElement = aList[HeapSort.HEAP_ROOT];
            aList[HeapSort.HEAP_ROOT] = aList[heapSize];
            this.adjust(aList, HeapSort.HEAP_ROOT, heapSize-1);
            return removedElement;
        }
    
        @Override
        public boolean sort(E[] aList){
            if(aList.length <= 1) return false;
    
            int minLoc = 0;
            for(int i = 1; i < aList.length; i++)
                if(this.compare(aList[minLoc], aList[i]) > 0) minLoc = i;
    
            this.swap(aList,minLoc,0);
    
            this.makeInitHeap(aList);
            for(int heapSize = aList.length-1; heapSize > 1; heapSize--){
                E maxElement = this.removeMax(aList, heapSize);
                aList[heapSize] = maxElement;
            }
            return true;
        }
Designed by Tistory.