>  기사  >  Java  >  버블 및 퀵 정렬에 대한 코드 예제

버블 및 퀵 정렬에 대한 코드 예제

Y2J
Y2J원래의
2017-05-15 09:34:131498검색

이 글에서는 주로 Java 버블정렬과 퀵정렬 예제코드를 소개하고 있으니 필요하신 분들은

버블정렬

버블 정렬은 간단한 정렬 알고리즘입니다. 정렬할 시퀀스를 반복적으로 살펴보며 한 번에 두 요소를 비교하고 순서가 잘못된 경우 교체합니다. 더 이상 교환이 필요하지 않을 때까지 어레이 방문 작업이 반복됩니다. 이는 어레이가 정렬되었음을 의미합니다. 이 알고리즘의 이름은 작은 요소가 스와핑을 통해 배열의 맨 위로 천천히 "부동"된다는 사실에서 유래되었습니다.

버블 정렬 알고리즘은 다음과 같이 구현됩니다. [정렬 후

배열이 작은 것부터 큰 것 순으로 정렬됩니다.]


  /**
  * 冒泡排序
  * 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 
  * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 
  * 针对所有的元素重复以上的步骤,除了最后一个。
  * 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 
  * @param numbers 需要排序的整型数组
  */
 public static void bubbleSort(int[] numbers)
 {
  int temp = 0;
  int size = numbers.length;
  for(int i = 0 ; i < size-1; i ++)
  {
  for(int j = 0 ;j < size-1-i ; j++)
  {
   if(numbers[j] > numbers[j+1]) //交换两数位置
   {
   temp = numbers[j];
   numbers[j] = numbers[j+1];
   numbers[j+1] = temp;
   }
  }
  }
 }

빠른 정렬

빠른 정렬의 기본 개념:

레코드를 분할하여 두 개의 독립적인 부분으로 정렬 하나의 정렬 단계를 통해 레코드의 한 부분의 키워드가 다른 부분의 키워드보다 작으면 전체 순서가 정해질 때까지 두 부분이 계속 정렬됩니다.

전체 시퀀스를 배열로 취급하고 0번째 위치를 중심축으로 간주하여 마지막 위치와 비교하여 그보다 작으면 교환하고, 크면 처리하지 않습니다. 교환한 후에는 더 작은 것과 결합됩니다. 그 끝과 비교하여 그보다 작으면 교환되지 않고, 그보다 크면 교환됩니다. 이런 식으로

을 앞뒤로 반복하여 한 패스로 정렬이 완료됩니다. 왼쪽은 중심축보다 작고 오른쪽은 중심축보다 큽니다. 메소드는 두 개의 독립적인 배열을 정렬하는 데 사용됩니다.

코드는 다음과 같이 구현됩니다.

1. 중심축의 위치를 ​​찾습니다(최하위 비트를 중심축으로 사용)


  /**
  * 查找出中轴(默认是最低位low)的在numbers数组排序后所在位置
  * 
  * @param numbers 带查找数组
  * @param low 开始位置
  * @param high 结束位置
  * @return 中轴所在位置
  */
 public static int getMiddle(int[] numbers, int low,int high)
 {
  int temp = numbers[low]; //数组的第一个作为中轴
  while(low < high)
  {
  while(low < high && numbers[high] > temp)
  {
   high--;
  }
  numbers[low] = numbers[high];//比中轴小的记录移到低端
  while(low < high && numbers[low] < temp)
  {
   low++;
  }
  numbers[high] = numbers[low] ; //比中轴大的记录移到高端
  }
  numbers[low] = temp ; //中轴记录到尾
  return low ; // 返回中轴的位置
 }

2.

재귀 형태의 분할 정복 정렬 알고리즘:


 /**
  * 
  * @param numbers 带排序数组
  * @param low 开始位置
  * @param high 结束位置
  */
 public static void quickSort(int[] numbers,int low,int high)
 {
  if(low < high)
  {
    int middle = getMiddle(numbers,low,high); //将numbers数组进行一分为二
    quickSort(numbers, low, middle-1); //对低字段表进行递归排序
    quickSort(numbers, middle+1, high); //对高字段表进行递归排序
  }
 }

3.

 /**
  * 快速排序
  * @param numbers 带排序数组
  */
 public static void quick(int[] numbers)
 {
  if(numbers.length > 0) //查看数组是否为空
  {
  quickSort(numbers, 0, numbers.length-1);
  }
 }

분석:

일반적으로 퀵 정렬은 동일한 크기(O(nlog2n))의 정렬 방법 중 평균 성능이 가장 좋은 것으로 간주됩니다. 그러나 초기 순서가 키순으로 정렬되거나 기본적으로 정렬되면 퀵 정렬은 버블 정렬로 변질됩니다. 이를 개선하기 위해 일반적으로 벤치마크 레코드를 선택하는 데 "3-in-1 방법"이 사용됩니다. 즉, 두 끝점을 중심으로 하는 3개의 레코드 키와 정렬 간격의 중간점을 지점 레코드로 조정합니다. Quicksort는 불안정한 정렬 방법입니다.

메소드 테스트인쇄

함수

:

public static void printArr(int[] numbers)
 {
  for(int i = 0 ; i < numbers.length ; i ++ )
  {
  System.out.print(numbers[i] + ",");
  }
  System.out.println("");
 }

테스트:

 public static void main(String[] args) 
 {
  int[] numbers = {10,20,15,0,6,7,2,1,-5,55};
  System.out.print("排序前:");
  printArr(numbers);
  bubbleSort(numbers);
  System.out.print("冒泡排序后:");
  printArr(numbers);
  quick(numbers);
  System.out.print("快速排序后:");
  printArr(numbers);
 }

결과:

정렬 전: 10,20,15,0,6,7,2,1,-5,55 ,

버블 정렬 후: -5,0,1,2,6,7,10,15,20,55,

빠른 정렬 후: -5,0,1, 2 ,6,7,10,15,20,55,

【관련 추천】

1.

특별 추천: " php Programmer Toolbox" V0.1 버전 다운로드 2.

무료 Java 비디오 튜토리얼

3.

Java 주석 종합 분석

위 내용은 버블 및 퀵 정렬에 대한 코드 예제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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