거품, 선택 삽입 정렬 알고리즘

정렬 알고리즘

또한 정렬 (정렬 알고리즘) 등의 알고리즘을 정렬, 정렬 프로세스는 일련의 데이터 배열은 특정 순서에 따라 인

분류 정렬

내부 정렬은 : 정렬 내부 메모리에 로딩되어 처리 될 모든 데이터를 의미

외부 정렬 방법 : 데이터를 모두 메모리로로드 너무 커서, 그것은 외부 저장 장치를 정렬 할 필요가있다

두 방법 (알고리즘)는 프로그램 실행 시간 측정

1. 이후 통계적 방법

이 방법은 가능하지만, 즉, 평가를위한 알고리즘 설계의 성능을 실행하기 위해, 당신이 실제로 프로그램을 실행하는 데 필요한 두 가지 문제가 있습니다 : 소득 등 환경 요인의 컴퓨터 하드웨어, 소프트웨어에 따라 달라집니다의 두 번째 시간 통계는 동일한 컴퓨터에서 동일한 상태에서 실행 알고리즘은 빠른 비교하기 위해 할 수있는 방법

2. 사전적인 추정 방법

알고리즘의 시간 복잡도를 분석하여 판단 할 것은 알고리즘 낫다

알고리즘의 시간 복잡도

시간 주파수 : 알고리즘의 알고리즘 실행 시간 함께 보낸 시간이 문 알고리즘이 더 자주 그가 보낸 시간이 더 실행 문에 비례, 실행 알고리즘 문의 수는 문 주파수 또는 주파수 시간이라고합니다. 로 표시 : T (N)

통계적인 시간 주파수 : N 증가 일정 용어로서, 하위 계수 조건은 무시 될 수있다

시간 복잡도

1. 일반적으로는 알고리즘 실행 문의 작동 반복 횟수는 T (n)에 대한 문제의 크기 (N)의 함수이며,이고, 보조 함수 F (N)와 같은 경우, N이 무한대에 도달한다면 , T (N) / F (N)을 F라고 상수 같지 제로 한계이다 (n)은 T (n)은 동일한 순서의 함수이다. T (n)에 의해 표시 = O (F (N)), O (F가 (N)) 알고리즘, 시간 복잡도 약어의 점진적인 시간 복잡도 인 것을

2.T (n)은 상이하지만 동시에 복잡 할 수있다

계산 시간 복잡도 3 항

  1. 대신 일정 주행 시간 모든 상수 T (N) = N ^ 2 + 7N + 6 => T (N) = N을 첨가 한 ^ 2 + 1 + 7N
  2. 단지 최상위 용어 T (N) = (N) N ^ 2 + 7N + 1 => T = 2 ^ N두고 수정 기능 시간 후에 실행
  3. 계수 T (n)은 높은 차항 = (N) N ^ 2 => T 제거 N = 2 ^

일반적인 시간 복잡도

1. 일정한 순서 O (1)의 코드 실행, 더 긴 순환 없기 때문에 복잡한 구조의 아무리 많은 라인이 코드의 시간 복잡도는 O (1) 호

2. 순서 O (log2n)

//说明:在while循环里面,每次都将i乘以2,乘完之后,i距离n就越来越近了,假设循环x次之后,退出循环,也就是说2的x次方等于n,那么x=log2n也就是说当循环log2n次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(log2n)
//如果a的x次方等于N(a>0,且a不等于1),那么数x叫做以a为底N的对数(logarithm),记作x=logaN。其中,a叫做对数的底数,N叫做真数
//这段代码执行log2^1024次
public static void main(String[] args) {
      int count=0;
      int i=1;
      int n=1024;
      while(i<n) {
          i=i*2;
          count++;
      }
      //log2^1024=10
      System.out.println(count);//10
      
    }

3. 선형 순서 O (n)은 : 환상 코드가 실행 n 회, 그에 의해 소비되는 시간이 N이다 대한 변화에 따라 변화

4 선형 대수 순서 O (nlog2n) 선형 대수 순서 O (nlogN) 이해할 실제로 매우 쉽고, 시간 복잡도는 O (logn) 코드 루프 N 배이며, 그 시간 복잡도는 N 개의 *의 O이다 (logN)

순서 O (N ^ 2)의 제곱 : 중첩 코드의 O는 (N), 다시 그 시간 복잡도는 (N ^ 2) O이면

//这段代码其实就是嵌套了2层n循环,他的时间复杂度就是O(n*n)
for(x=1;i<=n;x++) {
     for(x=1;i<=n;x++) {
            j=i;
            j++;
        }
    }

6. 입방 순서 O (N ^ 3)에 대한 3 개주기에 해당

7.k 번째 순서 (N ^ K)

제 지수 순서 O (2 ^ N)

우주의 복잡성

토론 시간 복잡도와 유사하게, 알고리즘 잠금이 소요되는 저장 공간에 대해 정의 된 알고리즘의 공간 복잡도, 그는 또한 문제 n의 규모의 함수이다

버블 정렬

정렬 때마다 최대 결정됩니다

package sort;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class BubbleSort {
    public static void main(String[] args) {
        //int arr[] = {3,9,-1,10,-2};
        //时间复杂度O(n^2)
        //测试冒泡排序的速度,要求排序80000个数字
        int[] arr = new int[80000];
        for(int i=0;i<arr.length;i++) {
            //每循环一次就添加一个元素
            arr[i]=(int)(Math.random()*80000);
        }
        Date data1 = new Date();
        System.out.println(data1);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr = sdf.format(data1);
        System.out.println("开始时间"+dateStr);
        System.out.println("排序进行中........");
        //对数组进行排序
        bubbleSort(arr);
        Date data2 = new Date();
        String dateStr2 = sdf.format(data2);
        System.out.println("开始时间"+dateStr2);
        System.out.println("排序结束");
        
    }
    public static void bubbleSort(int[] arr) {
        int temp = 0;//临时变量
        boolean b = false;
        for(int i=0;i<arr.length-1;i++) {//一共需要进行arr.length-1次排序
            for(int j=0; j<arr.length-1-i;j++) {
                if(arr[j]>arr[j+1]) {
                    b=true;
                    temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
            //System.out.println("第"+(i+1)+"次冒泡。。。。。");
            //System.out.println(Arrays.toString(arr));
            if(!b) {
                break;
            }else {
                b=false;//重置为false,是因为已经有进行过排序
            }
        }
    }
}
//冒泡排序平均15秒

선택 정렬

각 정렬 최소값 결정한

package sort;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class SelectSort {
    public static void main(String[] args) {
        int[] arr = new int[80000];
        for(int i=0;i<arr.length;i++) {
            //每循环一次就添加一个元素
            arr[i]=(int)(Math.random()*80000);
        }
        Date data1 = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr = sdf.format(data1);
        System.out.println("开始时间"+dateStr);
        System.out.println("排序进行中........");
        selectSort(arr);
        Date data2 = new Date();
        String dateStr2 = sdf.format(data2);
        System.out.println("开始时间"+dateStr2);
        System.out.println("排序结束");
        //System.out.println(Arrays.toString(arr));
    }
    //选择排序arr[0]=min
    public static void selectSort(int[] arr) {
        for(int i=0;i<arr.length-1;i++) {
            int minIndex = i;//假定最小索引为0
            int min = arr[i];//假定最小值是arr数组的0索引
            for(int j = 1+i;j<arr.length;j++) {
                if(min > arr[j]) {
                    min=arr[j];//重置最小值
                    minIndex=j;//重置最小值得索引 
                }
            }
            if(minIndex !=i) {//表示minIndex没有放生交换
                arr[minIndex] = arr[i+0];//101赋值给索引3
                arr[0+i] = min;//1赋值给索引0
            }
        }
    }
    
}
//选择排序平均3秒

삽입 정렬

요소는 요소의 적절한 삽입 위치를 찾는 방식으로 정렬하는 정렬 내부가 삽입되고 정렬, 이것은 순서의 목적을 가지고

사고 삽입 정렬은 두 개의 테이블의 배열로 간주 될 저장된 테이블 [0]의 초기 요소 도착 목록을 정렬 요소, 테이블 기억 무질서한 요소를 주문한 도착과 비교하여 [0]의 그래서, 삽입 위치를 결정하고있다.

package sort;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class InsertSort {
    public static void main(String[] args) {
        int[] arr = new int[80000];
        for(int i=0;i<arr.length;i++) {
            //每循环一次就添加一个元素
            arr[i]=(int)(Math.random()*80000);
        }
        Date data1 = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr = sdf.format(data1);
        System.out.println("开始时间"+dateStr);
        System.out.println("排序进行中........");
        insertSort(arr);
        Date data2 = new Date();
        String dateStr2 = sdf.format(data2);
        System.out.println("开始时间"+dateStr2);
        System.out.println("排序结束");
        //int arr[] = {3,9,-1,10,-2};
    }
    
    public static void insertSort(int[] arr) {
        for(int i = 1;i < arr.length; i++) {
            int insertVal = arr[i];
            int insertIndex = i-1;//i-1的意思是要把插入的数与前一个数比较
            //insertIndex >=0 防止越界
            //insertVal < arr[insertIndex])
            while(insertIndex >=0 && insertVal < arr[insertIndex]) {
                arr[insertIndex+1] = arr[insertIndex];//往后移
                insertIndex--;//继续与前面的数比较
            }
            if(insertIndex+1!=i) {
                arr[insertIndex+1] = insertVal;
            }
        }
    }
}
//平均时间5秒

추천

출처www.cnblogs.com/train99999/p/11123096.html