對簡單排序的二次改進

2021-07-17 02:02:24 字數 1769 閱讀 5598

簡單選擇排序的思想是每次從中選出最小(或者最大)的乙個元素,然後把該元素與當前list的最前面的元素交換,直至剩下最後乙個元素時,排序完畢

對簡單選擇排序的改進,主要是在選擇時,可以同時將當前list中的最大list[max]和最小元素list[min]都找出來,然後將最小元素與當前list中的首元素交換,然後再將最大的元素與當前list中的最後乙個元素交換,直至最後一組元素交換完畢,整個排序結束。這樣的話僅需要原來的一半。

舉個栗子,對於乙個無序 的list=,

1、找到當前最大的97和當前最小的4,將4交換到首位,將97交換到末位

2、找到從38到55區間段的最大值76和最小值13,將13交換到38的位置,將76交換到55的位置

3、找到從65到最後乙個49區間段的最大值65和最小值27,將65交換到49的位置,將27交換到65的位置,注意,這時候的交換順序為:

首先交換27到65處:4 13 27 55 38 65 49 76 97,這時候最大的65已經被交換走了,所以不能直接用記錄的最大值的位置list[2]去交換,因為65是與最小值27交換的,所以65的真實位置是找到的list[min],所以只需要list[min]與當前的最後乙個元素49交換即可。

4、找到從49(前)到49(後)的最大值55和最小值38,將38與49(前)交換,將55和49(前)交換

5、最後發現從49到49只剩下兩個元素,並且相等,故不需要交換,最後的排序結果即為:

注意:

實現思路:1、找到當前list的最大元素list[max]和最小元素list[min]

2、將最大元素list[max]和最小元素list[min]插入到當前的首位和末位

插入技巧

如果最小元素list[min]不等於當前list的首位:

否則:直接交換

最大元素list[max]與

當前list的末位元素

}

否則:直接交換最大元素list[max]與當前list的末位元素

交換技巧

如果兩個元素不相等,則進行交換,如果相等,則不做任何處理

其**實現如下:

#include #include void swap(int *a,int *b)

}void getnum(int array,int len,int start,int end)

if(min > array[i])

}printf("--------------------------------第%d次----------------------\n",(start+1));

printf("最小的元素array[%d] = %d\n",pmin,array[pmin]);

printf("最大的元素array[%d] = %d\n",pmax,array[pmax]);

/* printf("當前首元素array[%d] = %d\n",start,array[start]);

printf("當前末尾元素array[%d] = %d\n",end,array[end]);

*/ if(array[start] != array[pmin])

else

}else

}void showlist(int array,int len)

{ int i;

for(i=0;i

jQuery對JSON陣列的簡單排序

th 員工工號 th th 員工姓名 th th 員工年齡 th tr table table class grid table id tableb border 1 tr th 員工工號 th th 員工姓名 th th 員工年齡 th tr table table class grid tabl...

Spark的二次排序

1 資料樣本 1 52 4 3 61 3 2 11 14 2 45 4 11 3 23 5 12 6 13 2 排序規則 先按照第乙個字元排序,如果第乙個相同,再按照第二個字元排序 3 排序後的結果 1 31 5 1 14 2 12 4 2 45 3 63 23 4 11 5 12 6 13 4 s...

Hadoop Streaming二次排序

由於hadoop機器記憶體不足,所以需要把資料mapred進來跑。這樣,就需要,同乙個key下的輸入資料是有序的,即 對於keya的資料,要求data1先來,之後data2再來 所以需要對data進行二次排序。d stream.num.map.output.key.fields 2 這個,可以設定在...