兩種排序方式
現在介紹兩種著名的排序方式:
1, 冒泡排序:相鄰元素進行比較,較大的往右邊移動:結果就是每一次排序,最大的都會移動到右邊。最後結果就是升序的序列。
如:3,4,2,6,7
第一輪:1,3<4 不變 3,4,2,6,7
2,4>2 交換位置 3,2,4,6,7
3,4<6 不變 3,2,4,6,7
4,6<7 不變 3,2,4,6,7
第二輪:1,3>2 交換位置 2,3,4,6,7
2,3<4 不變
3. 4<6 不變
.。。。
轉換成一般性規律,每一輪比較最大值就會移動到最右邊來,一共會比較個數-1次。
用代碼實現的話:
for(int i=0;i<a.length-1;i++){
for(int j=0;j<a.length-1-i;j++){
if(a[j]>a[j+1]){
int temp;
temp =a[j];
a[j]=a[j+1];
a[j+1]=temp;}}}
外層的i循環表示的循環次數,內循環表示每一輪循環的狀況,變化在於j<a.length-1-i,因爲每一輪循環後,都會排出一個最大值,那個不用再進行比較,所以減去循環的次數。
2,選擇排序:有一個數組a[i]的話,選擇排序就是a[0]和後面的元素依次比較,接着a[1]和後面的元素一次比較
例:a[]={7,3,2,8,6,4}
第一輪:1,7>3,交換,3,7,2,8,6,4
2, 3>2,交換,2,7,3,8,6,4
3,3<8,3<6,3<4後面三步都是小於,所以不變。
第一輪結果:2,7,3,8,6,4
第二輪:1,7>3,交換,2,3,7,8,6,4
2,3<7,3<8,3<6,3<4.後面四部都是小於,所以不變
第二輪結果:2,3,7,8,6,4
第三輪:1,7<8 不變
2,7>6,交換,2,3,6,8,7,4
3,6>4,交換,2,3,4,8,7,6
第四輪1,8>7,交換,2,3,4,7,8,6
2,7>6,交換,2,3,4,6,8,7
第五輪1,8>7,交換,2,3,4,6,7,8
上述過程,說明選擇排序,每一輪都是把最小值選出放在左邊,經過元素個數-1論比較。
源碼:
for(int i=0;i<a.length-1;i++){
for(int j=i+1;j<a.length;j++){
if(a[i]>a[j]){
int temp;
temp =a[i];
a[i]=a[j];
a[j]=temp;}}}
外層循環i,是表示循環的次數,內存是比較的邏輯,需要注意的是:初始值j=i+1,是因爲,在一輪比較中a[i]是固定不變的,只需要下標i比較後面的值,而限定條件j<a.length的原因,每一回都取到的最右邊的值,也就是a[a.length-1]。