상용 정렬 알고리즘 및 JAVA 코드 구현
47474 단어 데이터 구조 와 알고리즘
1 간단하게 정렬 선택
// : :O(n^2) O:(n^2) O(n^2)
// ,
public static void selectSort(int[] arr){
for(int i = 0;i<arr.length-1;i++){
//
int min = i; // i
int temp = arr[min];
for(int j = i+1;j<arr.length;j++){
if(arr[j]<arr[min]){
min = j;
}
}
// ,min , arr[i]
// arr[i] i :
arr[i] = arr[min];
arr[min] = temp;
}
}
2 더미 정렬
// T(n): :O(nlogn) O(nlogn) O(nlogn)
// , maxHeapify(), maxHeapify() heapSort(),
public static void HeapSort(int[] arr){
// arr
int len = arr.length;
int k = (len-2)/2;
//
for(int i = k;i>=0;i--){
MaxHeapify(arr, i,len);
}
// ( ) ( )
// ,
for(int j = 0;j<len;j++){ // j
//
int temp = arr[len-1-j];
//
arr[len-1-j] = arr[0];
arr[0] = temp;
MaxHeapify(arr,0,len-j-1);
}
}
/**
* ,
*
* @param arr
* @param k
* @param len
*/
public static void MaxHeapify(int[] arr, int k, int len){
int temp = arr[k];
for(int i = 2*k+1;i<len;i=2*k+1){
//
if(i<len-1 && arr[i]<arr[i+1]){
i = i+1;
}
//
if(arr[i]<temp){
break;
}
//
arr[k] = arr[i];
arr[i] = temp;
//
k = i;
}
}
교환 클래스 정렬
1 거품 정렬
// : O(n) O(n^2) O(n^2)
public static void bubbleSort(int[] arr){
//
if(arr == null || arr.length ==0){
return;
}
// length-1
for(int i = 0;i<arr.length-1;i++){
for(int j = 1; j<arr.length-i ;j++){
if(arr[j-1]>arr[j]){
//
int temp = arr[j-1];
arr[j-1] = arr[j];
arr[j] = temp;
}
}
}
}
2 빠 른 정렬
// : O(nlogn) O(nlogn) O(n^2)
// : : , , ,
public static void quickSort(int[] arr, int low, int high){
if(low<high){
int pivot = findPivot(arr, low, high);
quickSort(arr, low, pivot-1);
quickSort(arr, pivot+1, high);
}
}
public static int findPivot(int[] arr, int i, int j){
int temp = arr[i];
while (i<j){
//
while (i<j && arr[j]>=temp){
j--;
}
if(i<j && arr[j]<temp){
arr[i] = arr[j];
i++;
}
//
while (i<j && arr[i]<=temp){
i++;
}
if(i<j && arr[i] >temp){
arr[j] = arr[i];
j--;
}
}
arr[j] = temp;
return i;
}
클래스 삽입 정렬
1 직접 정렬 삽입
// : O(n) O(n^2) O(n^2)
public static void insertSort(int[] arr){
if(arr == null || arr.length == 0){
return;
}
for(int i = 1; i< arr.length ;i++){
int temp = arr[i];
//
int j = i-1;
while (j>=0 && arr[j]>temp){
arr[j+1] = arr[j];
j--;
}
arr[j+1] = temp;
}
}
2 힐 정렬(증분 정렬 축소)
// O(n) O(nlogn) O(n^s ) 1
public static void shellSort(int[] arr){
if(arr == null || arr.length == 0){
return;
}
int len = arr.length;
for(int d = len/2 ; d>0;d = d/2){
for(int i = d;i<len;i++){
int temp = arr[i];
int j = i-d;
while (j>=0 && arr[j]>arr[j+d]){
arr[j+d] = arr[j];
j = j-d;
}
arr[j+d] = temp;
}
}
}
다른 형식 정렬
1.병합 정렬
// : / / O(nlogn)
public static void mergeSort(int[] arr, int l, int h, int[] temp){
if(l<h){
int mid = (l+h)/2;
mergeSort(arr, l, mid, temp);
mergeSort(arr,mid+1, h,temp);
merge(arr, l,mid,h,temp);
}
}
public static void merge(int[] arr, int l, int mid, int h, int[] temp){
int i = l;
int j = mid+1;
int t = 0;
while (i<=mid && j<= h){
if(arr[i]<arr[j]){
temp[t++]= arr[i++];
}else {
temp[t++]= arr[j++];
}
}
while (i<=mid){
temp[t++] = arr[i++];
}
while (j<=h){
temp[t++] = arr[j++];
}
t = 0;
while (l<=h){
arr[l++] = temp[t++];
}
}
2 기수 정렬
/**
*
*
*
*
*
*
*/
public class RadixSort {
public static void main(String[] args) {
int[] arr = {53, 3, 542, 748, 14, 214};
RadixSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void RadixSort(int[] arr){
int[][] bucket = new int[10][arr.length]; //
int[] elementCount = new int[10]; //
//
int max = arr[0];
for(int i = 1; i<arr.length;i++){
if(arr[i]>max){
max = arr[i];
}
}
int maxLength = (max+"").length();
//
for(int n = 0;n<maxLength;n++){
//
// i = 0 -> i = 1
for(int i = 0;i<arr.length;i++){
int l = arr[i]/((int)Math.pow(10, n+1)) % 10;
//
bucket[l][elementCount[l]] = arr[i];
elementCount[l]++;
}
int index = 0;
//
for(int j = 0; j<bucket.length ;j++){
if(elementCount[j] != 0){
for(int k = 0; k<elementCount[j];k++){
arr[index] = bucket[j][k];
index++;
}
}
elementCount[j] = 0;
}
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[JAVA] 배열 회전 출력요소 가 출력 을 시작 하 는 위치 에 주의 하 십시오. 모두 몇 라운드 의 수출 이 있 습 니까? n/2 + 1 매 라 운 드 는 상, 우, 하, 좌 로 나 뉜 다. 각 방향의 시작 위치 와 좌표 의 관 계 를 구...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.