본문 바로가기

개발(합니다)/컴퓨터 일반&CS

[알고리즘]정렬 알고리즘(버블, 삽입, 퀵)

반응형

정렬 알고리즘이란

잘 찾기 위해 하는 정리.
탐색을 위한 정렬.
데이터를 빠르고 쉽게 찾을 수 있게 하는 목적.








버블 정렬

데이터를 정렬하는 과정이 물 속 깊은 곳에서 일어난 거품이 수면을 향해 올라오는 모습이라 붙여진 명칭
집합 내의 이웃 되는 데이터를 순회하면서 비교 및 교환으로 정렬을 수행

사용을 지양해야 하는 정렬 알고리즘.
O(n^2)






삽입 정렬

뒤죽박죽 되어있는 트럼프 카드를 순서대로 정리하는 모습
데이터를 순회 하면서 필요한 값을 뽑아내어 필요한 위치에 삽입하여 정렬을 수행

사용을 지양해야 하는 정렬 알고리즘
O(n^2)






퀵 정렬

빨라서 이름이 퀵인 정렬
분할 정복을 기반한 알고리즘 : 적군를 싸우기 보다는 잘게 나누어 싸우는 전법
기준 값의 왼쪽에는 작은 수들을 놓고 오른쪽은 큰 수들 배치하여 정렬을 수행

사용을 지향해야 하는 정렬 알고리즘
O(nlogn)





C소스


버블 정렬

/*
* BubbleSort.c
*
* Created on: 2019. 1. 4.
* Author: otrodevym
*/

#include <stdio.h>
#include <stdlib.h>


void BubbleSort(int DataSet[], int Length){
    int i = 0;
    int j = 0;
    int temp = 0;

    for(i = 0; i < Length; i++){
        for(j = 0; j < Length-(i+1); j++){
            if(DataSet[j] > DataSet[j+1]){
                temp = DataSet[j+1];
                DataSet[j+1] = DataSet[j];
                DataSet[j] = temp;
            }
        }
    }
}


int BubbleSortMain(){
    int DataSet[] = {6, 4, 2, 3, 1, 5};
    int Length = sizeof(DataSet) / sizeof(DataSet[0]);

    int i = 0;

    BubbleSort(DataSet, Length);

    for(i = 0; i < Length; i++){
        printf(" %d " , DataSet[i]);
    }

    printf("\n");

    return 0;
}




삽입 정렬


/*
* InsertSort.c
*
* Created on: 2019. 1. 4.
* Author: otrodevym
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void InsertionSort(int DataSet[], int Length){
    int i = 0;
    int j = 0;
    int value = 0;

    for(i = 1; i < Length; i++){
        if(DataSet[i-1] <= DataSet[i]){
            continue;
        }
        value = DataSet[i];

        for(j = 0; j < i; j++){
            if(DataSet[j] > value){
                memmove(&DataSet[j+1], &DataSet[j], sizeof(DataSet[0])*(i-j));
                DataSet[j] = value;
                break;
            }
        }
    }
}

int InsertionSortMain(){
    int DataSet[] = {6, 4, 2, 3, 1, 5};
    int Length = sizeof(DataSet) / sizeof(DataSet[0]);
    int i = 0;

    InsertionSort(DataSet, Length);

    for(i = 0 ; i < Length; i++){
        printf("%d " , DataSet[i]);
    }
    printf("\n");

    return 0;
}




퀵 정렬


/*
* QuickSort.c
*
* Created on: 2019. 1. 4.
* Author: otrodevym
*/
#include <stdio.h>

void Swap(int* A, int* B){
    int temp = *A;
    *A = *B;
    *B = temp;
}

int Partition(int DataSet[], int Left, int Right){
    int First = Left;
    int Pivot = DataSet[First];

    ++Left;

    while(Left <= Right){
        while(DataSet[Left] <= Pivot && Left < Right){
            ++Left;
        }
        while(DataSet[Right] > Pivot && Left <= Right){
            --Right;
        }


        if(Left < Right){
            Swap(&DataSet[Left], &DataSet[Right]);
        }else{
            break;
        }
    }
            Swap(&DataSet[First], &DataSet[Right]);
        return Right;
}

void QuickSort(int DataSet[], int Left, int Right){
    if(Left < Right){
        int Index = Partition(DataSet, Left, Right);

        QuickSort(DataSet, Left, Index-1);
        QuickSort(DataSet, Index+1, Right);
    }
}




int QuickSortMain(){
    int DataSet[] = {6, 4, 2, 3, 1, 5};
    int Length = sizeof(DataSet)/sizeof(DataSet[0]);
    int i = 0;

    QuickSort(DataSet, 0, Length-1);

    for(i = 0; i < Length; i++){
        printf("%d ", DataSet[i]);
    }

    printf("\n ");

    return 0;
}



퀵정렬2


/*
* QuickSort2.c
*
* Created on: 2019. 1. 4.
* Author: otrodevym
*/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>


int CompareScore(const void *_eleml1, const void *_elem2){
    int* elem1 = (int*)_eleml1;
    int* elem2 = (int*)_elem2;

    if(*elem1 > *elem2){
        return 1;
    }else if(*elem1 < *elem2){
        return -1;
    }else{
        return 0;
    }
}

int main(){
    int DataSet[] = {6, 4, 2, 3, 1, 5};
    int Length = sizeof(DataSet)/sizeof(DataSet[0]);

    int i = 0;

    qsort((void*)DataSet, Length, sizeof(int), CompareScore);
    for(i = 0; i < Length; i++){
        printf("%d ", DataSet[i]);
    }
    printf("\n");

    return 0;
}



Java 소스

버블 정렬


package e_sort;

public class BubbleSort {
    private void BubbleSort(int[] data) {
        int temp = 0;
        for(int i = 0; i < data.length; i++) {
            for(int j = (i+1); j < data.length; j++) {
                if(data[i] > data[j]) {
                    temp = data[j];
                    data[j] = data[i];
                    data[i] = temp;
                }
                
            }
        }
    }
    
    public static void main(String args[]) {
        BubbleSort bs = new BubbleSort();
        int[] data = {5, 2, 4, 3, 1,};
        
        bs.BubbleSort(data);
        for(int i : data) {
            System.out.print(i + " " );
        }
    }
}


삽입 정렬

package e_sort;

public class InsertionSort {
    public void InsertionSort(int[] data) {
        int temp = 0;
        for (int i = 1; i < data.length; i++) {
            temp = data[i];
            int j = i-1;
            while(j >=0 && temp < data[j]) {
                data[j+1] = data[j];
                j--;
            }
            data[j+1] = temp;
        }
    }

    public static void main(String args[]) {

        InsertionSort is = new InsertionSort();
        int[] data = { 5, 2, 3, 4, 1 };
        is.InsertionSort(data);

        for (int i : data) {
            System.out.print(" " + i);
        }
    }
}



퀵 정렬

package e_sort;

public class QuickSort {
    public void swap(int[] data, int index1, int index2) {
        int temp = 0;
        
        temp = data[index1];
        
        data[index1] = data[index2];
        
        data[index2] = temp;
        
    }
    
    public int partition(int[] data, int left, int right) {
        int first = left;
        int pivot = data[left];
        
        while(left < right) {
            while(data[left] <= pivot && left < right) {
                ++left;
            }
            while(data[right] > pivot && left <= right) {
                --right;
            }
            
            if(left < right) {
                swap(data, left, right);
            }else {
                break;
            }
        }
        
        swap(data, first, right);
        
        return right;
    }
    
    public void quickSort(int[] data, int left, int right) {
        if(left < right) {
            int index = partition(data, left, right);
            
            quickSort(data, left, index-1);
            quickSort(data, index+1, right);
        }
    }
    
    public static void main(String args[]) {
        QuickSort qs = new QuickSort();
        int data[] = {6, 4, 2, 3, 1, 5};
        
        
        qs.quickSort(data, 0, data.length-1);
        for(int i : data) {
            System.out.print(i + " ");
        }
    }
}


반응형