>  기사  >  Java  >  JAVA 단순 선택 정렬 알고리즘 원리 및 구현

JAVA 단순 선택 정렬 알고리즘 원리 및 구현

高洛峰
高洛峰원래의
2017-01-17 13:08:352188검색

간단한 선택 정렬: (가장 작은 값을 선택하여 먼저 넣은 다음 첫 번째 값을 뒤로 이동하는 등) 첫 번째 값을 다음 값과 하나씩 비교하고 가장 작은 값을 맨 위에 놓습니다. 비트가 뒤로 밀려납니다(즉, 방금 선택한 첫 번째 비트가 최소값이므로 더 이상 비교에 포함되지 않으며 비교 횟수가 1만큼 줄어듭니다.)

복잡성: 레코드를 이동하는 데 필요한 연산은 0--3(n-1)보다 작으며, 레코드의 초기 배열에 관계없이 키워드 간 필요한 비교 횟수는 n(n-1)/2로 동일하며, 총 시간 복잡도는 O(n2)입니다.
공간 복잡도 O(1)

알고리즘 개선: 모든 비교는 가장 작은 값을 먼저 두므로 끝까지 비교하여 가장 작은 값을 찾을 수 있습니다. 의미 없는 스왑 및 이동 작업을 제거하고 이를 우선적으로 배치합니다. 방향을 변경하고 마지막 비트를 이전 비트와 비교하여 매번 최대값이 아래쪽으로 가라앉고 마지막 비트가 앞으로 이동하도록 할 수도 있습니다.

JAVA 소스 코드:

 public static void selectSort(Date[] days) {
  int min;
  Date temp;
  for (int i = 0; i < days.length; i++) {
   min = i;
   for (int j = min + 1; j < days.length; j++) {
    if (days[min].compare(days[j]) > 0) {
     min = j;
    }
   }
   if (min != i) {
    temp = days[i];
    days[i] = days[min];
    days[min] = temp;
   }
  }
 }
class Date {
 int year, month, day;
 Date(int y, int m, int d) {
  year = y;
  month = m;
  day = d;
 }
 public int compare(Date date) {
  return year > date.year ? 1 : year < date.year ? -1
    : month > date.month ? 1 : month < date.month ? -1
      : day > date.day ? 1 : day < date.day ? -1 : 0;
 }
 public void print() {
  System.out.println(year + " " + month + " " + day);
 }
}

단순 선택 정렬:

단순 선택 정렬은 버블 정렬과 유사하며 항상 아래 요소 집합에서 가장 높은 값을 선택합니다. 현재 위치에 채우세요. 유일한 차이점은 버블 정렬은 현재 값보다 작거나 큰 것을 발견할 때마다 요소의 위치를 ​​교환하는 반면, 단순 선택 정렬은 나머지 요소 중에서 가장 높은 값을 선택하여 현재 값과 데이터를 교환한다는 것입니다. 위치.

 예를 들어 요소 집합 R={37, 40, 38, 42, 461, 5, 7, 9, 12}

 첫 번째 정렬 패스에서 37이 직접 교환됩니다. 5를 사용하여 새 시퀀스 R1={5,40,38,42,461,37,7,9,12}
두 번째 정렬에서 40을 7과 직접 교환하여 새 시퀀스 R2={5, 7, 38,42,461,37,40,9,12}

등을 마지막 요소까지 계속합니다(참고: 두 번째 정렬 단계에서는 38이 42보다 작지만 데이터를 교환하지 않습니다). .

다음은 단순 선택 정렬의 Java 구현 버전입니다.

  public static void selectionSort(int[] data) {
  if (data == null || data.length <= 1)
  return;
  int i, j, value, minPos, len = data.length;
  int outer = len - 1, tmp;
  for (i = 0; i < outer; i++) {
  value = data[i];
  minPos = -1;
  for (j = i + 1; j < len; j++) {
  if (data[j] < value) {
  minPos = j;
  value = data[j];
  }
  }
  if (minPos != -1) {
  tmp = data[i];
  data[i] = value;
  data[minPos] = tmp;
  }
  //            for (int k = 0; k < len; k++) {
  //                System.out.print(data[k] + " , ");
  //            }
  //            System.out.println();
  }
  }
  public static void main(String[] args) {
  int[] coll = {
  37, 40, 38, 42, 461, 5,  7, 9, 12
  };
  selectionSort(coll);
  for (int i = 0; i < coll.length; i++) {
  System.out.print(coll[i] + " , ");
  }
  }

트리 선택 정렬(Tree Selection Sort)
단순 선택 정렬에 비해 트리 선택 정렬 알고리즘은 일반적으로 알고리즘입니다. 시간과 공간을 교환하기 위해. 아이디어는 정렬된 N 요소를 처리하고 상대적으로 작은 (n+1)/2 숫자를 구성한 다음 요소가 하나만 남을 때까지 상대적으로 작은 [n+1]/4 숫자를 구성하는 것입니다. 완전한 이진 트리로 구성됩니다.
정렬할 때 요소가 가장 작습니다. 가장 작은 요소를 꺼내고 요소를 "최대값"으로 바꾼 다음 완전한 이진 트리를 조정합니다.
다음은 트리 선택 정렬의 Java 구현입니다.

  public static void treeSelectionSort(int[] data) {
  if (data == null || data.length <= 1)
  return;
  int len = data.length , low = 0 , i , j;
  // add Auxiliary Space
  int[] tmp = new int[2*len -1];
  int tSize = tmp.length;
  //construct a tree
  for(i =len-1 , j=tmp.length-1;i >=0 ;i--,j--){
  tmp[j]=data[i];
  }
  for(i = tSize -1 ; i > 0 ; i-=2){
  tmp[(i-1)/2] = tmp[i] > tmp[i-1]? tmp[i-1]:tmp[i];
  }
  //end
  //remove the minimum node.
  while(low < len){
  data[low++] = tmp[0];
  for(j=tSize-1;tmp[j]!=tmp[0];j--);
  tmp[j] = Integer.MAX_VALUE;
  while(j > 0){
  if(j%2 == 0){  //如果是右节点
  tmp[(j-1)/2] = tmp[j] > tmp[j-1]?tmp[j-1]:tmp[j];
  j = (j-1)/2;
  }else{  //如果是左节点
  tmp[j/2]=tmp[j] > tmp[j+1]? tmp[j+1]:tmp[j];
  j = j/2;
  }
  }
  }
  }

완전한 이진 트리를 구성할 때 N 요소 집합에는 2*N -1 보조 공간이 필요합니다.
코드:

  while(j > 0){
  if(j%2 == 0){  //如果是右节点
  tmp[(j-1)/2] = tmp[j] > tmp[j-1]?tmp[j-1]:tmp[j];
  j = (j-1)/2;
  }else{  //如果是左节点
  tmp[j/2]=tmp[j] > tmp[j+1]? tmp[j+1]:tmp[j];
  j = j/2;
  }
  }

는 새 세트에서 최소값의 재귀적 구성을 구현합니다.

JAVA 단순 선택 정렬 알고리즘의 원리 및 구현과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.