ソートアルゴリズム
並べ替え(ソートアルゴリズム)としても、アルゴリズムをソート、ソート処理は、指定された順序に従って配置され、データの集合であります
分類のソート
内部ソートは:ソートする内部メモリにロードされ、処理されるすべてのデータを参照します
外部ソート方法:データはすべてメモリにロードするには余りにも大きいです、それは外部ストレージをソートする必要があります
両方の方法(アルゴリズム)は、プログラムの実行時間を計測します
1.その後の統計的手法
この方法は可能であるが、二つの問題、すなわち、評価のためのアルゴリズム設計のパフォーマンスを実行するために、あなたが実際にプログラムを実行する必要があります。収入の統計は、などの環境要因のコンピュータのハードウェア、ソフトウェア、依存する第二の時間は、どのアルゴリズムを比較するために、同じコンピュータで同じ状態で実行する方法が速いです
2.事前推定法
アルゴリズムの時間計算量を分析することによって判断すること、より良いアルゴリズムです
アルゴリズムの時間複雑
時間周波数:アルゴリズムのアルゴリズムの実行時間と一緒に過ごした時間が、ステートメントのアルゴリズムは、より頻繁に彼が費やした多くの時間を実行した文、に比例し、実行アルゴリズム文の数は声明の周波数または周波数時間と呼ばれます。 T(N)と表記
統計的な時間周波数:Nが増加すると、定数項、低次の項が係数を無視することができます
時間複雑
1.一般的には、アルゴリズム実行ステートメントの操作の繰り返し回数は、補助関数F(N)であればT(n)を表す、で、問題のサイズnの関数であり、例えばN無限大に近づきます、T(N)/ F(n)は、Fと呼ばれる定数ゼロ限界に等しくない(N)T(n)が同程度の関数です。T(N)= O(F(N))で表される、O(F(N))は、前記アルゴリズムの進行時間複雑であり、時間の複雑頭文字
2.T(n)は異なるが、それは同時に複雑であってもよいです
計算時間の複雑3の方法
- 代わりの一定走行時間によって全て定数T(N)= N ^ 2 + 7N + 6 => T(N)= Nを添加する1 ^ 2 + 7N + 1
- = N ^ 2のみ最高次の項T(N)= N ^ 2 + 7N + 1 => T(n)を残して、変形関数の後に時間を実行
- 係数T(n)の最上位用語= N ^ 2 => T(n)を除去= 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)は再び、彼の時間複雑度はO(N ^ 2)の場合、
//这段代码其实就是嵌套了2层n循环,他的时间复杂度就是O(n*n)
for(x=1;i<=n;x++) {
for(x=1;i<=n;x++) {
j=i;
j++;
}
}
前記立方オーダーはO(n ^ 3)のための3サイクルに相当
オーダー(N ^ K)番目7.k
8.指数オーダー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秒
挿入ソート
挿入をソートする要素の適切な挿入位置を見つけるための方法でソートされる要素のために、それは順序の目的を持って、内部の一種であります
思考の挿入ソートの2つのテーブルの配列として見られることであり、記憶されたテーブルは、要素、テーブル記憶無秩序要素を順序付け、初期要素ARRの順序付きリスト[0]、ARRと比較して[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秒