빠른 정렬
아이디어 :
기본적으로 가장 왼쪽 값이 기준입니다.
오른쪽에서 기준 값보다 작은 값을 찾습니다
. 왼쪽에서 기준 값보다 큰 값을 찾습니다 .
위치 교환 (왼쪽이 크지 않은 경우 참조와 직접 위치). 다음과 같이
반복 ...
/**
* 快速排序
* @param a 排序数组
* @param left 左下标
* @param right 右下标
*/
public void quickSort(int []a, int left, int right) {
//右边游标小于等于左边游标排序结束
if (right <= left) {
return;
}
int tmp = a[left],
min = left,
max = right,
time;
while (min < max) {
//找到右边比左边小
while (min < max && a[max] >= tmp) {
max--;
}
//找到右边比左边大
while (min < max && a[min] <= tmp) {
min++;
}
//交换
time = a[max];
a[max] = a[min];
a[min] = time;
}
//交换基准
a[left] = a[min];
a[min] = tmp;
//对左边快排
quickSort(a, left, max - 1);
//对右边快排
quickSort(a, max + 1, right);
}
버킷 정렬
요점 :
데이터 값을 배열 인덱스로 사용하고
배열 요소는 데이터 발생 횟수를 기록합니다.
```java
/**
* 桶排序
* @param a 排序数组
*/
//桶排序
public void buckSort(int a[]){
//获取最大值
OptionalInt max = Arrays.stream(a).max();
//生成max+1个桶
int[] bucks = new int[max.getAsInt() + 1];
//记录每个数字的出现次数
//索引为元素值,元素为值出现次数
for (int i : a) {bucks[i]++;}
//排序数组a的索引
int index=0;
//遍历桶,排序数组a重排序
for (int i = 0; i < bucks.length; i++) {
//根据数字出现次数(元素值),给排序数组赋值
for (int j = 0; j < bucks[i]; j++) {
a[index++]=i;
}
}
}
더 추가 ...