>  기사  >  php教程  >  데이터 구조: 이진 검색, 빠른 정렬 아이디어 및 구현

데이터 구조: 이진 검색, 빠른 정렬 아이디어 및 구현

高洛峰
高洛峰원래의
2016-12-19 16:18:131208검색

최근에는 어떻게 디자인을 해야 할지, 어떻게 코딩을 더 잘할지, 객체지향적 사고를 좀 더 완전하게 이해해야 할지 고민하고 있고, 이런 측면에서도 의도적으로 공부하고 있습니다. 저도 몇년동안 코드를 작성하면서 정리하고 정리해보니 가장 중요한 것은 생각하는 것이었습니다. "프로그래밍 실습"이라는 책을 검토하고 내가 작성한 코드의 스타일, 품질, 성능, 이식성 등을 더욱 표준화하고 반영했습니다. 데이터 구조에 대한 지식과 알고리즘이 더욱 통합됩니다. 필기시험에서 자주 접하는 알고리즘인 이진 검색, 퀵 정렬 알고리즘에 대해 적어보겠습니다. 알고리즘 구현의 핵심은 구현 아이디어에 있습니다.

(1) 이진 검색
이진 검색은 실제로 절반 검색으로, 보다 효율적인 검색 방법입니다. 필요한 배열을 검색합니다.
주요 아이디어는 다음과 같습니다. (검색된 배열 주기가 배열[낮음, 높음]이라고 가정)
(1) 주기의 중간 위치 K를 결정
(2) 검색된 값 T와 배열[을 비교합니다. k] 비교해보세요. 동일하면 검색이 성공하고 이 위치로 돌아갑니다. 그렇지 않으면 새 검색 영역을 결정하고 이진 검색을 계속합니다. 영역은 다음과 같이 결정됩니다.
a.array[k]>T 배열 순서에 따라 array[k,k+1,…,high]>T이므로 새 간격은 array[low]입니다. ,… …, K-1]
b.array[k]

시간 복잡도: O(log2n);

코드 구현:
                                                                                                                           ;/요약>
                                    ~ > ~                                                                 ,,,,, ,,,,,,,,,,,,,,,,,,, 높음, 중간;
낮음 = 0;
높음 = array.Length - 1;
동안(낮음 <= 높음)
{
mid = (낮음 + 높음) / 2 ;
if (array[mid] < T)
{
낮음 = 중간 + 1;
}
               else if (배열[중간]>T)
                                                        ~       ​return mid;
}
}
return -1;
}

(2) 퀵 정렬 알고리즘
퀵 정렬은 가능한 한 추가 계산을 피하는 훌륭한 예입니다. 작동 방식은 배열의 작은 요소와 큰 요소를 나누는 것입니다.
기본 아이디어는 다음과 같습니다.
배열 가져오기 기본 값으로서의 요소
다른 요소를 두 그룹으로 나눕니다.
"소형"은 기본 값보다 작은 요소입니다.
"큰" 요소는 기본 값보다 큰 요소입니다.
이 두 그룹을 재귀적으로 정렬합니다.
퀵 정렬이 빠른 이유는 요소가 기준 값보다 작다는 것을 알게 되면 더 큰 요소와 비교할 필요가 없기 때문입니다. 큰 요소는 작은 요소와 비교할 필요가 없습니다. 이 속성을 사용하면 단순 정렬 ​​및 버블 정렬보다 빠른 정렬이 훨씬 빨라집니다.

时速复杂degree:O(nlogn)
代码实现:
        ///


        /// 快速排序
        ///

        / //
        ///         ///
        public void QuickSort(int[] array,int left,int right)
        {
            int last;
            if (left>=right)
return;
            int rand = (왼쪽+오른쪽)/2;
            Swap(배열, 왼쪽, rand);
            last = left;
            for (int i = left + 1; i < = right; i++)
           {
               if (array[i] < array[left])
                 Swap(array, ++last, i);
            }
            스왑(배열, 왼쪽, 마지막);
            QuickSort(배열, 왼쪽, 마지막 - 1);
            QuickSort(배열, 마지막 + 1, 오른쪽);
        }

        ///


        /// 交换两个值
        ///

        ///
        /// < param name="i">
        ///
        private void Swap(int[] a,int i,int j)
        {
            int temp;
            temp = a[i];
           a[i] = a[j];
           a[j] = temp;
        }



更多数据结构之two分法查找、快速排序思想与实现상关文章请关注PHP中文网!

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