选择排序 冒泡 java_排序扯淡:冒泡、选择、插入(Java)
算法的本質
最近一直在想,算法的本質到底是什么,為什么有時云里霧里,有時卻了然可見,深深思考了下,算法本質就是一個解決問題的思想,計算機的世界里需要的就是抽象的思想,有了抽象思想,你就有了高度,原諒我突然的。
冒泡、選擇、插入排序的本質
常見的平均時間復度為O(n2)的冒泡,選擇,插入排序算法的本質是什么,說白了就是一個交換位置思想,以及什么時候交換位置,怎么交換位置。先貼一下交換位置的代碼,一會要用:
public?static?void?swap(int[] arr,int?i,int?j){
arr[i] = arr[i] + arr[j];
arr[j] = arr[i] - arr[j];
arr[i] = arr[i] - arr[j];
}
簡單的把一個數組的兩個位置的值交換一下,數組也傳進來了,交換有效。
冒泡排序
冒泡排序,就是最大的數字或最小的數字經過比較大小并交換位置后從數組中冒出來,冒到數組最左端或最右端。
假如有一個數組:8,9,6,7,5,我們將他們冒一個泡泡,按照我們的抽象思想,開啟循環,然后冒泡。第一次冒泡只要把9冒出到數組最右端,9已經是最大的泡泡了。第二次冒泡,可以直接忽略9了,只要把8冒出到數組的最右端(這里是指忽略9的情況),直到循環結束。貼一段言簡意賅的代碼:
public?static?void?sort(int[] arr){
int?length = arr.length;
for(int?i=length-1;i>0;i--) {
for(int?j=0;j
if(arr[j]>arr[j+1]) {
swap(arr,j,j+1);
}
}
}
}
我們需要兩次循環依次把最大的數從數組中冒出去,如果左邊的數值大于相鄰的右邊的數值,就將兩個位置的數值進行交換。
選擇排序
選擇排序可以看作是一個冒泡排序的變種,選擇排序先從數組中選擇一個基準值作為最小值或最大值,然后再和剩下的數組元素逐一比較,循環找到最小的數組下標,然后交換最小值與基準位置的數值。
還是數組:8,9,6,7,5,基準值默認選擇外部循環的第一個元素,第一次選擇8為基準值,這里的基準值被當作最小值對待,內部循環剩下的數組元素,經過一輪比較,不斷調整最小值的下標,找到最小數值的元素下標,然后將最小值與基準值交換。貼一段言簡意賅的代碼,貌似和冒泡排序變化不大:
public?static?void?sort(int[] arr){
int?length = arr.length;
int?minIndex;
boolean?swapFlag;
for(int?i=0;i
minIndex = i;
swapFlag =?false;
for(int?j=i+1;j
if(arr[j]
minIndex = j;
swapFlag =?true;
}
}
if(swapFlag) {
swap(arr,i,minIndex);
}
}
}
選擇排序每次記錄下最小元素數值下標,然后與基準值交換位置,如果基準值已經是最小值,就不會再進行交換操作,交換次數明顯小于冒泡排序,數據集較大時,選擇排序要優于冒泡排序。
插入排序
插入排序同樣可以看作是冒泡排序的一個變種,插入排序同樣選擇一個基準值,一般外部循環循環的當前下標元素為基準值,插入排序就是要將基準值左邊的子數組排好序,在內部循環內,從數組下標0開始到基準下標比較大小并交換位置,直到把基準位置左邊子數組排好序,最終外部循環結束。
還是數組:8,9,6,7,5,第一次選擇下標1即元素9作為基準下標,然后從數組起始下標開始到基準下標開始比較對應元素數值大小,8小于9不需要交換位置,第二次選擇6為基準下標,再次從數組起始下標到基準下標比較數值大小,6和8交換位置,9和8交換位置,數組變為:6,8,9,7,5。說是插入排序,其實還是保證局部排序,然后不斷用外部元素與已排序子數組循環比較,將外部元素交換到排序子數組中。
public?static?void?sort(int[] arr){
int?length = arr.length;
int?baseIndex;
for(int?i=1;i
baseIndex = i;
for(int?j=0;j
if(arr[j]>arr[baseIndex]) {
swap(arr,j,baseIndex);
}
}
}
}
簡單排序總結
以上三種排序算法是最簡單排序,平均時間復雜度均為O(n2),因為都需要兩次循環,只是交換規則略不相同,實現方式都是先將數組局部排序然后直到數組全部排序。
總結
以上是生活随笔為你收集整理的选择排序 冒泡 java_排序扯淡:冒泡、选择、插入(Java)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于微服务成熟度模型的高可用优化实践
- 下一篇: spark Java oracle,sp