> Java > java지도 시간 > Java에서 1억 개의 난수를 정렬하는 방법은 무엇입니까?

Java에서 1억 개의 난수를 정렬하는 방법은 무엇입니까?

WBOY
풀어 주다: 2023-05-09 17:31:08
앞으로
1755명이 탐색했습니다.

1. 직접 삽입 정렬

1. 그림 삽입 정렬

아이디어: 말 그대로 삽입은 특정 규칙에 따라 요소를 특정 세트에 넣는 것이므로 시퀀스를 두 부분으로 나누어야 합니다. 는 순서가 있는 집합이고, 다른 부분은 정렬되는 집합입니다

그림:

Java에서 1억 개의 난수를 정렬하는 방법은 무엇입니까?

이해의 편의를 위해 가장 특수한 4321 시퀀스를 예로 들어보겠습니다.

위에 따르면 아이디어, 우리는 시퀀스를 두 부분으로 나누어 코딩의 편의를 위해 첫 번째 요소가 순서 집합이라고 가정하고 루프 는 덮어쓰기를 피하기 위해 두 번째 요소 인 3

에서 시작해야 합니다. 3 후속 작업에서는 임시 변수를 선택하여 저장합니다. 3. 이것이 위의 val=arr[1]입니다.val=arr[1] ,

由于是对数组继进行操作 , 我们同时也需要获取有序集合的最后一个元素的索引作为游标

当游标不越界 , 且待插入的值小于游标指示位置时(上图的4) , 我们将元素4后移 , 游标前移,继续检查集合中的其它元素是否也小于待插入的元素, 直到游标越界

上图由于集合内只有一个4, 游标前移越界了, 因此循环终止. 下一轮比较开始执行

2. 代码实现

public static void insertSort(int[]arr){
        for(int i = 1 ; i < arr.length; i++){
            int val = arr[i];
            int valIndex = i - 1; //游标
            while(valIndex >= 0 && val < arr[valIndex]){ //插入的值比游标指示的值小
                arr[valIndex + 1] = arr[valIndex];
                valIndex--; //游标前移
            }
            arr[valIndex+1] = val;
        }
    }
1234567891011
로그인 후 복사

3.性能检测与时空复杂度

实际运行80w个数据耗时1分4秒(非准确值,每台机器可能都不一样)

Java에서 1억 개의 난수를 정렬하는 방법은 무엇입니까?

直接插排在排序记录较少, 关键字基本有序的情况下效率较高

时间复杂度 :

关键字比较次数 : KCN=(n^2)/2 总移动次数 : RMN= (n^2)/2

因此时间复杂度约为 O(N^2)

二、希尔排序(交换法)

1. 思路图解

Java에서 1억 개의 난수를 정렬하는 방법은 무엇입니까?

2. 代码实现

public static void shellSort(int[] arr){ //交换法
        int tmp = 0;
        for(int gap = arr.length / 2 ; gap > 0 ; gap /= 2){
            for(int i = gap ; i < arr.length ; i++){ //先遍历所有数组
                for(int j  = i - gap ; j >= 0 ; j -= gap){//开启插入排序
                    if(arr[ j ] > arr[ gap + j ]){ //可以根据升降序修改大于或小于
                        tmp = arr[gap + j];
                        arr[j+gap] = arr[j];
                        arr[j] = tmp;
                    }
                }
            }
            System.out.println(gap);
            System.out.println(Arrays.toString(arr));
        }
    }
12345678910111213141516
로그인 후 복사

这里最难理解的应该是第三个for循环,j = i - gap, 表示小组内的第一个元素,即j=0,

当小组内的第一个元素大于第二个元素时(由于是逻辑上的分类,第二个元素的索引应当是第一个元素的所有值+增量gap) , 交换两者,反之j-=gap,继续比较或跳出循环 ,

如此往复将所有小组都遍历完之后 , 缩小增量(即gap/=2) , 然后继续上述步骤, 直到增量gap为1时, 序列排序结束

3. 时间复杂度

希尔排序的时间复杂度取决于增量序列的函数 , 需要具体问题具体分析,并不是一个确定的值,这也是第四点需要讨论的问题

4. 关于增量的选择

上述我们在做排序的时候增量缩减选用的时gap/=2的模型, 这并不是最优的选择 , 关于增量的选取 , 属于数学界尚未解决的一个问题

但是可以确定的是, 通过大量的实验证明 ,当n->无穷大

배열에서 작업하고 있으므로

ordered도 얻어야 합니다. set 마지막 요소의 인덱스를 커서로 사용합니다Java에서 1억 개의 난수를 정렬하는 방법은 무엇입니까?

커서가 경계를 넘지 않고 삽입할 값이 커서가 가리키는 위치보다 작은 경우(4<3</code) > 위 그림에서) 요소 4를 뒤로 이동하면 커서가 앞으로 이동하여 커서가 경계를 넘을 때까지 세트의 다른 요소가 삽입될 요소보다 작은지 계속 확인합니다. 4개만 세트에 있으면 커서가 앞으로 이동하여 경계를 넘어가므로 다음 비교 라운드가 시작됩니다<strong> </strong>2. 코드 구현</p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:py;">public static void shellSort02(int[] arr){ //移位法 for(int gap = arr.length/2 ; gap &gt; 0 ; gap /= 2){ //分组 for(int i = gap ; i &lt; arr.length ; i++){ //遍历 int valIndex = i; int val = arr[valIndex]; if(val &lt; arr[valIndex-gap]){ //插入的值小于组内另一个值 while(valIndex - gap &gt;=0 &amp;&amp; val &lt; arr[valIndex-gap]){ //开始插排 // 插入 arr[valIndex] = arr[valIndex-gap]; valIndex -= gap; //让valIndex = valIndex-gap (游标前移) } } arr[valIndex] = val; } } } 12345678910111213141516</pre><div class="contentsignin">로그인 후 복사</div></div><h3>3. 성능 테스트 및 시공간 복잡성</h3> <p>실제로 소요됩니다. 80만 개의 데이터를 실행하는 데 1분 4초(정확한 값은 아니며, 머신마다 다를 수 있음)<strong></strong><img src="https%20://img.php.cn/upload/article/000/887/227/%20168362467251913.png" alt="자바에서 난수 1억개 정렬하는 방법"></p> <h4>직접 삽입하고 정렬하는 레코드가 적고, 키워드로 기본적으로 정렬하면 효율성이 높아집니다</h4> <p><strong>시간 복잡도:</strong><strong></strong>개수 키워드 비교: <code>KCN=(n^2)/2 총 이동 횟수: RMN= (n^2)/2

그러므로 시간 복잡도는 O(N^2)2. 힐 정렬(교환 방법)

1. 아이디어 일러스트레이션Java에서 1억 개의 난수를 정렬하는 방법은 무엇입니까?

Java에서 1억 난수 배열 방법

2. 코드 구현

rrreee

여기서 가장 이해하기 어려운 점은 아마도 세 번째 for 루프인 일 것입니다. j = i - 간격, 이는 그룹의 첫 번째 요소, 즉 j=0을 나타냅니다.

Java에서 1억 개의 난수를 정렬하는 방법은 무엇입니까?그룹의 첫 번째 요소가 두 번째 요소보다 큰 경우(
논리적 분류로 인해 두 번째 요소의 인덱스는 첫 번째 요소의 모든 값 + 증분 간격Java에서 1억 개의 난수를 정렬하는 방법은 무엇입니까?)이어야 하며, 두 개를 교환하고, 그렇지 않으면 j-=gap, 계속 비교하거나 루프에서 벗어나려면
Java에서 1억 개의 난수를 정렬하는 방법은 무엇입니까?이런 방식으로 모든 그룹을 순회한 후 증분을 줄이고(예: gap/=2) 증분 간격이 1이 될 때까지 위 단계를 계속합니다. , 그리고 시퀀스 정렬이 종료됩니다

🎜3. 시간 복잡도🎜🎜힐 정렬의 시간 복잡도는 🎜증분 시퀀스🎜의 기능에 따라 달라지며, 이는 특정 문제에 대한 구체적인 분석이 필요하며 결정된 값이 동일하지 않습니다. 네 번째 논의해야 할 점🎜🎜4. 증분 선택에 관하여🎜🎜위 정렬을 했을 때🎜증분 감소🎜 gap/=2 모델을 선택했을 때 이는 최적의 선택이 아닙니다. .증분의 선택은 수학계의 미해결 문제입니다🎜🎜하지만 확실한 것은 수많은 실험을 통해 n->무한대 code>일 때 시간 복잡도가 🎜🎜🎜🎜🎜다음 포인트인 🎜shift 방법🎜에서도 여러 실험을 수행했으며 특정 규모(예: 800w~1억)에 대해 계산 측면에서 🎜힐 정렬은 힙 정렬보다 훨씬 빠릅니다🎜, 적어도 내 컴퓨터에서는 🎜🎜3. 힐 정렬(시프트 방식)🎜🎜교환 방식이 시프트 방식보다 훨씬 느리기 때문에 🎜시프트 방식🎜이 더 일반적으로 사용됩니다. , 시프트 방법은 삽입 정렬 🎜🎜에 더 가깝습니다. 아이디어 🎜🎜이 아이디어는 실제로 위의 두 가지 정렬 방법을 조합하여 🎜그룹🎜을 그룹화하는 것입니다. 🎜삽입🎜의 장점과 결합하면 효율성은 다음과 같습니다. 매우 높음🎜🎜은 ​​🎜분할 및 정복🎜 아이디어를 구현하여 더 큰 시퀀스를 여러 개의 작은 시퀀스로 절단합니다🎜🎜🎜🎜🎜2 코드 구현🎜rrreee🎜3.

위 내용은 Java에서 1억 개의 난수를 정렬하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:yisu.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿