package UP_kontrolno2;

/**
 *
 * @author Михаил Николов
 * @date 12.01.2011
 */
public class Sort {

    public static void main(String[] args) {
        //test
        int[] array = new int[]{4, 7, 1, 3, 11, 9, 16, 5};
        Sort.output(array);
        System.out.println("\nМетод на пряката селекция:");
        Sort.output(Sort.SelectionSort(array));
        System.out.println("\nМетод на мехурчето:");
        Sort.output(Sort.BubbleSort(array));
        System.out.println("\nСортиране чрез вмъкване:");
        Sort.output(Sort.InsertionSort(array));
    }

    private static void output(int[] array) {
        for(int i = 0; i < array.length; i++)
            System.out.print(array[i] + ", ");
        System.out.print("\n");
    }

    private static void exchange(int[] array, int a, int b) {
        int swap = array[a];
        array[a] = array[b];
        array[b] = swap;
    }

    // Метода на пряката селекция
    public static int[] SelectionSort(int[] array) {
        int min_index;
        for(int i = 0; i < array.length - 1; i++) {
            min_index = i;
            for(int j = i + 1; j < array.length; j++)
                if(array[j] < array[min_index])
                    min_index = j;

            Sort.exchange(array, i, min_index);
        }

        return array;
    }

    // Метода на мехурчето
    public static int[] BubbleSort(int[] array) {
        boolean flag = true;
        for(int pos = array.length - 1; (pos > 0 && flag); pos--) {
            flag = false;
            for(int i = 0; i < pos; i++)
                if(array[i] > array[i+1]) {
                    Sort.exchange(array, i, i+1);
                    flag = true;
                }
        }

        return array;
    }

    // Сортиране чрез вмъкване
    public static int[] InsertionSort(int[] array) {
        for(int pos = 1; pos > array.length; pos++) {
            int i = pos;
            while((array[i] < array[i-1]) && (i > 0)) {
                Sort.exchange(array, i, i-1);
                i = i - 1;
            }
        }

        return array;
    }
}
