요약 : 여덟 정렬 알고리즘

디렉토리

첫째, 삽입 정렬

(1) 직접 삽입 정렬

 

2, 힐 정렬

 

둘째, 선택 정렬

1, 간단한 선택 정렬

 

2, 힙 정렬

 

셋째, 교환 정렬

1, 거품 정렬

 

2, 빠른 정렬

 

넷째, 병합 정렬


첫째, 삽입 정렬

(1) 직접 삽입 정렬

삽입 후 최초 정렬의 제 1 부분을 완료하고, 다른 부분은 요소 삽입되는 상기 어레이의 모든 요소 (요소 제외 삽입 될) 것을 정렬 어레이는 두 부분으로 나눌 수 : 알고리즘 생각 소자. 제 1 부분의 두 부분이 다시 수행으로 분할 상기 정렬.

여기서 기본 도착 [0] 배수 시퀀스 부, [J]를, 언 = 도착 [J - 1] 수가 뒤에서부터 앞으로 이송의 수보다 작은 경우 정렬되는 전류를 나타내고, 그 다음 후방으로 이동 도착 [J]를 = 온도가 상기 삽입 위치에 해당하는 값을 나타낸다.

int[] arr = {1,4,2,8,74,12,9,30,8,11,22,87,12,44,28};
int gap = 1,i,j;
int temp;
int len = arr.length;
for(i = 1;i < len;i++){
    temp = arr[i];
    for(j = i;j >= 1&&arr[j - 1] > temp;j -= 1){
        arr[j] = arr[j - 1];
    }
    arr[j] = temp;
}

평균 시간 복잡도

최상의 경우

최악의 경우

우주의 복잡성

O (n²)

O (N)

O (n²)

O (1)

 

2, 힐 정렬

이진 각 갭 후 감소되고, 상술 한 동작 사이클;시 갭 = 1은 직접적인 삽입을 사용하여, 전체 어레이는 정렬의 정렬 직접 삽입하는 방법을 사용하여 각 그룹의 요소를 다음 단계에서 패킷의 간격을 정렬 할 정렬. )

실제로 직접 삽입 정렬 공정을 나타내는 힐 정렬 단계는 갭 된 두 개의 값이 1과 비교된다. 이것은 직접 삽입 정렬에 대한 최적화이다.

int[] arr = {1,4,2,8,74,12,9,30,8,11,22,87,12,44,28};

int gap = 1,i,j;
int temp;
int len = arr.length;
while(gap < len /3){
    gap = gap * 3 + 1;
}
for(;gap > 0; gap /= 3){
    for(i = gap ; i < len;i++){
        temp = arr[i];
        for(j = i;j >= gap && arr[j - gap]> temp;j -= gap){
            arr[j] = arr[j - gap];
        }
        arr[j] = temp;
    }
}

 

평균 시간 복잡도

최상의 경우

최악의 경우

우주의 복잡성

O (nlog2 않음)

O (nlog2 않음)

O (nlog2 않음)

O (1)

 

둘째, 선택 정렬

1, 간단한 선택 정렬

이 알고리즘은 비교적 간단 가장 작은 값을 매번 찾아, 그리고 그의 이전의 첫 번째 첨자 1, 2 ..... arr.length-1 교환 저장.

int[] arr = {1,4,2,8,74,12,9,30,8,11,22,87,12,44,28};
for(int i = 0;i < arr.length - 1;i++){
    int min = i;
    for(int j = i + 1;j < arr.length;j++){
        if(arr[j] < arr[i]){
            min = j;
        }
    }
    if(min != i){
        int temp = arr[i];
        arr[i] = arr[min];
        arr[min] = temp;
    }
}

O (n²)

O (n²)

O (n²)

O (1)

 

2, 힙 정렬

상단은 큰 힙입니다 더미에 모든 첫 번째 배열의 첫 번째. 그런 다음 각 다시, 상위 요소 heapify를 큰 위로 더미를 복용 통과. 전체 순서.

public static void main(String[] args) {
//        int[] arr = {1,4,2,8,74,12,9,30,8,11,22,87,12,44,28};
        int[] arr = {2,5,3,1,10,4};
        heap_sort(arr,arr.length);
        for(int k = 0;k < arr.length;k++){
            System.out.print(arr[k] + " ");
        }

    }
    //通过堆排序,输出
    public static void heap_sort(int[] arr,int len){
        build_heapify(arr,len);
        for(int i = len - 1;i >= 0; i--){
            swap(arr,i,0);
            heapify(arr,i,0);
        }
    }
    //构建整个堆,每一个堆节点
    public static void build_heapify(int[] arr,int len){
        int last_node_index = len - 1;
        int parent_index = (last_node_index - 1) / 2;
        for(int i  = parent_index;i >= 0;i--){
            heapify(arr,len,i);
        }
    }
    //对单个堆进行排序
    public static void heapify(int []arr,int len,int i){
        if(i >= len)
            return ;
        int left = i * 2 + 1;
        int right = i * 2 + 2;
        int max = i;
        if(left < len && arr[max] < arr[left])
            max = left;
        if(right < len &&arr[max] < arr[right])
            max = right;
        if(max != i){
            swap(arr,max,i);
            heapify(arr,len,max);
        }
    }
    public static void swap(int[] arr,int x,int y){
        int temp = arr[x];
        arr[x] = arr[y];
        arr[y] = temp;
    }

평균 시간 복잡도

최상의 경우

최악의 경우

우주의 복잡성

O (nlog2n)

O (nlog2n)

O (nlog2n)

O (1)

 

셋째, 교환 정렬

1, 거품 정렬

이 알고리즘은 마지막 위치에 상대적으로 간단하고 직접적인 최대 버블 링입니다.

for(int i = arr.length;i >= 0;i--){
    for(int j = 0;j < i&& j + 1 < i;j++){
        if (arr[j] > arr[j + 1]){
            int temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
}

평균 시간 복잡도

최상의 경우

최악의 경우

우주의 복잡성

O (n²)

O (N)

O (n²)

O (1)

 

2, 빠른 정렬

빠른 정렬 버블 정렬이 아이디어의 최적화가이다 : 참조 값을 선택, 참조 값의 왼쪽은 그 값보다 적은 권리보다됩니다.

public static void quick_sort(int[] arr ,int low,int high){
    if(arr.length < 0 || low > high)
        return ;
    int left = low;
    int right = high;
    //保存基准值
    int temp = arr[left];
    while(left < right){
        //从后向前找到比基准小的元素
        while(left < right && arr[right] >= temp){
            right--;
        }
        arr[left] = arr[right];
        //从前往后找到比基准大的元素
        while(left < right && arr[left] <= temp){
            left++;
        }
        arr[right] = arr[left];
    }
    arr[left] = temp;
    quick_sort(arr,low,left - 1);
    quick_sort(arr,left + 1,high);
}

O (nlog₂n)

O (nlog₂n)

O (n²)

(재귀 분할 버전 대신) O (1)

 

넷째, 병합 정렬

생각 :

. ① 각각의 인접한 두 개의 시퀀스 번호 (/ 2 N) 서열을 조작하는 층을 병합, 두 정렬 된 요소들을 포함하고 각각 서열;

. ② 상기 시퀀스가 ​​다시 형성하도록 병합 A (N / 4) 층 시퀀스 네 개의 요소를 각각 포함하는 서열;

③. 단계를 반복은 ②, 모든 요소 정렬 될 때까지.

 

public static int[] mergingSort(int[] arr){
    if(arr.length <= 1)
        return arr;
    int num = arr.length >> 1;
    int[] arrLeft = Arrays.copyOfRange(arr,0,num);
    int[] arrRight = Arrays.copyOfRange(arr,num,arr.length);
    return mergeTwoArray(mergingSort(arrLeft),mergingSort(arrRight));
}

public static int[] mergeTwoArray(int[] arr1,int[] arr2){
    int[] result = new int[arr1.length + arr2.length];
    int i = 0,j = 0, k = 0;
    while(i < arr1.length && j < arr2.length){
        if(arr1[i] < arr2[j]){
            result[k++] = arr1[i++];
        }else{
            result[k++] = arr2[j++];
        }
    }
    while(i < arr1.length){
        result[k++] = arr1[i++];
    }
    while(j < arr2.length){
        result[k++] = arr2[j++];
    }
    return result;
}

다섯째, 기수 정렬

생각의 버킷 종류의 사용

public static void radixSort(int[] arrays){
    int max = findMax(arrays);

    //遍历位数
    for(int i = 1;max / i > 0;i *= 10){
        int[][] buckets = new int[arrays.length][10];
        //获取每一位数字(个、十、百、千位...分配到桶子里)
        for(int j = 0;j < arrays.length;j++){
            int num = (arrays[j] / i) % 10;
            //将其放入桶子里
            buckets[j][num] = arrays[j];
        }
        //回收桶子里的元素
        int k = 0;

        for(int j = 0;j < 10;j++){
            for(int y = 0;y < arrays.length;y++){
                if(buckets[y][j]!=0){
                    arrays[k++] = buckets[y][j];
                }
            }
        }
    }
}

public static int findMax(int[] arrays){
    int max = 0;
    for(int i = 0;i < arrays.length;i++){
        if(arrays[i] > max){
            max =arrays[i];
        }
    }
    return max;
}

 

发布了134 篇原创文章 · 获赞 91 · 访问量 16万+

추천

출처blog.csdn.net/weixin_44588495/article/details/104082500