當(dāng)前位置:
首頁 >
距离矢量路由算法的java代码_八大排序算法比较(附Java代码)
發(fā)布時(shí)間:2023/12/3
30
豆豆
生活随笔
收集整理的這篇文章主要介紹了
距离矢量路由算法的java代码_八大排序算法比较(附Java代码)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
冒泡排序
/*** 冒泡排序 比較好理解* 兩兩相比 較大的放后面* 時(shí)間復(fù)雜度O(n^2)*//*** 改進(jìn)前的冒泡排序算法進(jìn)行100,000數(shù)據(jù)排序運(yùn)行時(shí)間為:3829ms* 優(yōu)化后的冒泡排序算法進(jìn)行100,000數(shù)據(jù)排序運(yùn)行時(shí)間為:3551ms*/ public static void bubbleSort(int[] array){ //原始的冒泡排序,比較的次數(shù)是固定的int len=array.length;int temp=0;for(int i=0;i<len-1;i++){for(int j=0;j<len-1-i;j++){if(array[j]>array[j+1]){temp=array[j];array[j]=array[j+1];array[j+1]=temp;}}} }public static void bubbleSort2(int[] array){ //改進(jìn)的冒泡排序,有序時(shí)無需比較int len=array.length;int temp=0;boolean flag=true;for(int i=0;i<len-1;i++){for(int j=0;j<len-1-i;j++){if(array[j]>array[j+1]){flag=false;temp=array[j];array[j]=array[j+1];array[j+1]=temp;}}if(flag){ //如果有序 則跳出循環(huán)break;}else {flag=true;}} }插入排序
/*** 插入排序,將無序元素依次插入到有序數(shù)組中* 和選擇排序很類似。但是其時(shí)間取決于數(shù)組的初始順序* 時(shí)間復(fù)雜度為O(n^2)*//*** 由于數(shù)據(jù)量大時(shí)可能存在一堆數(shù)據(jù)后移的情況,所以時(shí)間并不一定比選擇排序快* 插入排序算法進(jìn)行50,000數(shù)據(jù)排序運(yùn)行時(shí)間為:1280ms*/ public static void insertSort(int[] array){int temp=0;int len=array.length;for(int i=1;i<len;i++){for(int j=i;j>0;j--){if(array[j]<array[j-1]){temp=array[j];array[j]=array[j-1];array[j-1]=temp;}}} }選擇排序
/*** 選擇排序* 與冒泡排序不同,無需頻繁進(jìn)行交換的操作,時(shí)間較冒泡排序短* 時(shí)間復(fù)雜度為O(n^2)*//*** 選擇排序算法進(jìn)行50,000數(shù)據(jù)排序運(yùn)行時(shí)間為:626ms*/public static void selectSort(int[] array){int len=array.length;int temp=0;for (int i=0;i<len;i++){int min=i; //min為最小值對(duì)應(yīng)的索引for(int j=i;j<len;j++){ //內(nèi)層循環(huán)的目的是為了找到最小值if(array[j]<array[min]){min=j;}}temp=array[min];array[min]=array[i];array[i]=temp;} }希爾排序
/*** 希爾排序* 插入排序的變種,慢慢地調(diào)整數(shù)組的順序,使插入排序效率變高* 最壞情況下時(shí)間復(fù)雜度為O(n^(1-2))*//*** 希爾排序的效率肯定是要比插入排序要高的* 希爾排序算法進(jìn)行50,000數(shù)據(jù)排序運(yùn)行時(shí)間為:705ms*/ public static void shellSort(int[] array){int len=array.length;int h=1;while(h<len/3)h=3*h+1; //希爾排序的增量,相鄰增量應(yīng)該盡可能互斥!!! h=1,4,13,40,121...int temp=0;while (h>=1){for (int i=h;i<len;i++){for(int j=i;j>=h;j-=h){if(array[j]<array[j-h]){temp=array[j];array[j]=array[j-h];array[j-h]=temp;}}}h/=3;} }快速排序
/*** 快速排序* 使用遞歸的方法,有一些難以理解,多看幾遍就好* 主要思想就是設(shè)定pivot,將所有比pivot大的放右邊,比pivot小的放左邊* 平均的時(shí)間復(fù)雜度為O(nlogn) ,有序情況下的復(fù)雜度為O(n^2)*//*** 快排是真的快 ,比冒泡插入選擇希爾要快上好多* 快速排序算法進(jìn)行50,000數(shù)據(jù)排序運(yùn)行時(shí)間為:4.00ms*/ public static void quickSort(int[] array, int left, int right){if(left>right){ //遞歸結(jié)束的條件!!! 沒有這個(gè) 遞歸就出不來了return;}int L=left,R=right;int pivot=array[left]; //pivot隨意設(shè)置,這里我們?cè)O(shè)置pivot為最左邊的元素while (left<right){while (array[right]>=pivot && right>left){ //一定要大于等于或者小于等于 不然數(shù)字相同可能出現(xiàn)死循環(huán)right--; //右指針不斷后移}if(right>left){array[left]=array[right]; //左右指針不重合時(shí),將right的值賦給left}while (array[left]<=pivot && right>left){left++; //左指針開始移動(dòng)}if(left<right){array[right]=array[left];}}array[left]=pivot; //完成第一次排序quickSort(array,L,left-1);quickSort(array,left+1,R); }歸并排序
/*** 歸并排序* 同樣使用遞歸,采用分而治之的想法,通過遞歸的方式將若干個(gè)有序序列合并為一個(gè)* 時(shí)間復(fù)雜度為 O(nlogn),同樣非常快*//*** 歸并排序算法進(jìn)行50,000數(shù)據(jù)排序運(yùn)行時(shí)間為:4.90ms*/public static void merge(int[] array,int left,int mid,int right){ //進(jìn)行歸并操作的函數(shù)int[] temp=new int[right-left+1]; //建立緩存數(shù)組int i=left,j=mid+1;int index=0; //temp的索引while (i<=mid && j<=right){if(array[i]<=array[j]){ // temp[index]=array[i]; // i++; // index++;temp[index++]=array[i++]; //這段代碼可以簡化成這個(gè)形式}else {temp[index++]=array[j++];}}while (i<=mid){temp[index++]=array[i++];}while (j<=right){temp[index++]=array[j++];}for (int k=left;k<=right;k++){ //將temp傳回arrayarray[k]=temp[k-left];} }public static void mergeSort(int[] array,int left,int right){ //歸并排序if(left>=right){return;}int mid=(left+right)/2;mergeSort(array,left,mid);mergeSort(array,mid+1,right); //先分解成最小的merge(array,left,mid,right); //再合并 }基數(shù)排序
/*** 基數(shù)排序* 空間換時(shí)間,所以時(shí)間復(fù)雜度最低,為 O(d(n+r)) r是基數(shù)(基本都是10),d為長度。。。 可趨近于O(n)* PS:我反而覺得基數(shù)排序比較復(fù)雜,提前需要設(shè)置很多變量和數(shù)組*//*** 基數(shù)排序算法進(jìn)行50,000數(shù)據(jù)排序運(yùn)行時(shí)間為:2.35ms*/ public static void radixSort(int[] array){int max=array[0];for (int i=1;i<array.length;i++){if(array[i]>max){max=array[i]; //首先找到數(shù)組中的最大數(shù)}}int times=(max+"").length(); //得到桶排序的輪數(shù),也就是最大數(shù)有幾位int[][] temp=new int[10][array.length]; //定義10個(gè)桶,每個(gè)桶的容量為元素總個(gè)數(shù)int t=1; //t表示第幾輪int n=1; //每過一輪n*10,為了得到相應(yīng)位的數(shù)字int num;int[] orderTemp=new int[10]; //數(shù)組orderTemp[i]用來表示該位是i的數(shù)的個(gè)數(shù)while (t<=times){for(int i=0;i<array.length;i++){num=(array[i]/n)%10;temp[num][orderTemp[num]]=array[i];orderTemp[num]++;}int index=0;for (int i=0;i<10;i++){if(orderTemp[i]>0){ //如果桶中元素大于0for (int j=0;j<orderTemp[i];j++){array[index++]=temp[i][j];}}orderTemp[i]=0; //一定要把桶子清空哦!!}n*=10;t++;} }堆排序
/*** 堆排序* 1)將待排序的序列構(gòu)造成一個(gè)大頂堆* 2)將根節(jié)點(diǎn)與末尾元素交換,末尾元素就為最大值* 3)剩余數(shù)據(jù)重新構(gòu)造成一個(gè)大頂堆* 4)不斷執(zhí)行操作,完成排序* 時(shí)間復(fù)雜度為O(nlogn)*//*** 堆排序算法進(jìn)行50,000數(shù)據(jù)排序運(yùn)行時(shí)間為:4.07ms*/public static void adjustHeap(int[] arr,int i, int length){ //調(diào)整一個(gè)以i為頂點(diǎn)的子樹int temp=arr[i];for (int k=i*2+1;k<length;k=k*2+1){if(k+1<length && arr[k]<arr[k+1]){k++; //如果左葉子小于右葉子,k就變成右葉子}if (temp<arr[k]){ //對(duì)子樹進(jìn)行調(diào)整. 注意!這里要用temp來比較不能用a[i],我們目的是把temp進(jìn)行移動(dòng)arr[i]=arr[k];i=k;} else {break; //說明該子樹已然是一個(gè)最大堆,直接跳出循環(huán)即可}}arr[i]=temp; }public static void heapSort(int[] arr){for(int i=arr.length/2-1;i>=0;i--){ //i從最后一個(gè)非葉子節(jié)點(diǎn)開始。位置為i=arr.length/2-1adjustHeap(arr,i,arr.length); //該步驟為建立一個(gè)最大堆}for (int i=arr.length-1;i>0;i--){int temp=arr[i];arr[i]=arr[0];arr[0]=temp;adjustHeap(arr,0,i);} }完結(jié)撒花~
總結(jié)
以上是生活随笔為你收集整理的距离矢量路由算法的java代码_八大排序算法比较(附Java代码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3650m5设置u盘启动_系统重装必备神
- 下一篇: java类验证和装载顺序_Java类的加