데이터 구조의 정렬 찾기
/** * * , * @author asdc * */
public class Array {
public final static int MAXSIZE = 20;
/** * , key , <0 O(logN) * @param a * @param key * @return */
public static int binarySearch(long[] a, long key){
int lo = 0;//
int hi = a.length - 1;//
while(lo < hi){
int mid = (lo + hi)/2;//
if(key == a[mid]){
return mid;
}else if(key > a[mid]){
lo = mid + 1;
}else if(key < a[mid]){
hi = mid - 1;
}
}
return -1;
}
/** * * @param a * @param key * @return */
public static int interpolationSearch(long[] a, long key){
// , , ,
// mid = (lo + hi)/2
// mid = lo/2 + hi/2 ----> mid = lo + hi/2 - lo/2 ----> mid = lo + (hi - lo)/2
//mid = lo + (1/2)(hi - lo) 1/2 (key - a[lo])/(a[hi] - a[lo])
// mid = lo + (hi - lo) * (key - a[lo])/(a[hi] - a[lo])
int lo = 0;//
int hi = a.length - 1;//
while(lo < hi){
int mid = (int) (lo + (hi - lo) * (key - a[lo])/(a[hi] - a[lo]));//
if(key == a[mid]){
return mid;
}else if(key > a[mid]){
lo = mid + 1;
}else if(key < a[mid]){
hi = mid - 1;
}
}
return -1;
}
/** * * @param a * @param key * @return */
public static int fibonacciSearch(long[] a,long key){
int lo = 0;
int hi = a.length - 1;
int[] f = fibonacci();
int k = 0;//
while(a.length > f[k] - 1){
k++;
}
long[] temp = new long[f[k] - 1];
for(int i = 0; i < a.length; i++){
temp[i] = a[i];
}
// f[k]
//
for (int i = a.length; i < f[k] - 1; i++) {
temp[i] = temp[hi];
}
while (lo <= hi) {
// low:
// f[k-1] , 0
// -1
int mid = lo + f[k - 1] - 1;
if (temp[mid] > key) {
// ,
hi = mid - 1;
// ( ) = ( )+( )
// f[k] = f[k-1] + f[k-2]
// f[k-1] , k = k-1
k = k - 1;
} else if (temp[mid] < key) {
// ,
lo = mid + 1;
// ( ) = ( )+( )
// f[k] = f[k-1] + f[k-2]
// f[k-1] , k = k-2
k = k - 2;
} else {
//
if (mid <= hi) {
return mid;
} else {
//
// high
return hi;
}
}
}
return -1;
}
/** * * @return */
public static int[] fibonacci(){
int[] f = new int[MAXSIZE];
f[0] = 1;
f[1] = 1;
for(int i = 2; i < MAXSIZE; i++){
f[i] = f[i - 1] + f[i - 2];
}
return f;
}
//
// : mid = (lo + hi)/2
// : mid = lo + (hi - lo)*(key-a[lo])/(a[hi]-a[lo])
// : mid = low + f[k-1] - 1
// ,
// , ,
/** * * @param a * @return */
public static void bubbleSort(long[] a){
boolean isSort = true;//
for(int j = a.length - 1; j > 0; j--){
for(int i = 0; i < j; i++){
if(a[i] > a[i + 1]){
isSort = false;
//
long temp = a[i + 1];
a[i + 1] = a[i];
a[i] = temp;
}
}
if(isSort == true){
break;
}
}
}
/** * * @param a * @param lo * @param hi */
public static void Merger(long[] a, int lo, int hi, int mid){
long[] temp = new long[hi - lo];//
int indexA = lo;
int indexB = mid;//
// temp
int i = 0;
while(indexA < mid && indexB < hi){
if(a[indexA] > a[indexB]){
temp[i++] = a[indexB++];
}else{
temp[i++] = a[indexA++];
}
}
// temp
while(indexA < mid){
temp[i++] = a[indexA++];
}
while(indexB < hi){
temp[i++] = a[indexB++];
}
// a
for (int k2 = 0; k2 < temp.length; k2++) {
a[k2 + lo] = temp[k2];
}
}
public static void MergerSort(long[] a, int lo, int hi){
if (hi > lo) //hi - lo > 1
{
int mid = (lo + hi) / 2;
System.out.println(" " + lo + "," + mid);
MergerSort(a, lo, mid);
System.out.println(" " + (mid+1) + "," + hi);
MergerSort(a, mid + 1, hi);
Merger(a, lo, hi, mid);
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
귀속할 필요가 없는 2점 찾기오늘 동료가 차에서 나에게 면접을 본다고 했는데, 이 문제가 있었는데, 그는 해내지 못했다 회사에 가서 직접 간단히 썼다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.