/**
* 冒泡法排序
*比較相鄰的元素祝辣。如果第一個比第二個大贴妻,就交換他們兩個。
*對每一對相鄰元素作同樣的工作蝙斜,從開始第一對到結尾的最后一對名惩。在這一點,最后的元素應該會是最大的數(shù)孕荠。
*針對所有的元素重復以上的步驟娩鹉,除了最后一個。
*持續(xù)每次對越來越少的元素重復上面的步驟稚伍,直到?jīng)]有任何一對數(shù)字需要比較弯予。
*@paramnumbers 需要排序的整型數(shù)組*/
public static voidbubbleSort(int[] numbers) {
inttemp;// 記錄臨時中間值
intsize = numbers.length;// 數(shù)組大小
for(inti =0; i < size -1; i++) {
for(intj = i +1; j < size; j++) {
if(numbers[i] < numbers[j]) {// 交換兩數(shù)的位置
temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
}
}
}
}
/**
* 快速排序
*
*
從數(shù)列中挑出一個元素,稱為“基準”
*
重新排序數(shù)列槐瑞,所有元素比基準值小的擺放在基準前面熙涤,所有元素比基準值大的擺在基準的后面(相同的數(shù)可以到任一邊)。在這個分割之后困檩,
* 該基準是它的最后位置祠挫。這個稱為分割(partition)操作。
*
遞歸地把小于基準值元素的子數(shù)列和大于基準值元素的子數(shù)列排序悼沿。
*
*
*@paramnumbers
*@paramstart
*@paramend
*/
public static voidquickSort(int[] numbers,intstart,intend) {
if(start < end) {
intbase = numbers[start];// 選定的基準值(第一個數(shù)值作為基準值)
inttemp;// 記錄臨時中間值
inti = start, j = end;
do{
while((numbers[i] < base) && (i < end))
i++;
while((numbers[j] > base) && (j > start))
j--;
if(i <= j) {
temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
i++;
j--;
}
}while(i <= j);
if(start < j)
quickSort(numbers, start, j);
if(end > i)
quickSort(numbers, i, end);
}
}
/**
* 選擇排序
*
在未排序序列中找到最小元素慌植,存放到排序序列的起始位置
*
再從剩余未排序元素中繼續(xù)尋找最小元素,然后放到排序序列末尾丈钙。
*
以此類推雏赦,直到所有元素均排序完畢芙扎。
*
*@paramnumbers
*/
public static voidselectSort(int[] numbers) {
intsize = numbers.length, temp;
for(inti =0; i < size; i++) {
intk = i;
for(intj = size -1; j >i; j--)? {
if(numbers[j] < numbers[k])? k = j;
}
temp = numbers[i];
numbers[i] = numbers[k];
numbers[k] = temp;
}
}
/**
* 插入排序
*
*
從第一個元素開始俏橘,該元素可以認為已經(jīng)被排序
*
取出下一個元素圈浇,在已經(jīng)排序的元素序列中從后向前掃描
*
如果該元素(已排序)大于新元素汉额,將該元素移到下一位置
*
重復步驟3榨汤,直到找到已排序的元素小于或者等于新元素的位置
*
將新元素插入到該位置中
*
重復步驟2
*
*
*@paramnumbers
*/
public static voidinsertSort(int[] numbers) {
intsize = numbers.length, temp, j;
for(inti=1; i
temp = numbers[i];
for(j = i; j >0&& temp < numbers[j-1]; j--)
numbers[j] = numbers[j-1];
numbers[j] = temp;
}
}
/**
* 歸并排序
*
*
申請空間妓灌,使其大小為兩個已經(jīng)排序序列之和蜜宪,該空間用來存放合并后的序列
*
設定兩個指針圃验,最初位置分別為兩個已經(jīng)排序序列的起始位置
*
比較兩個指針所指向的元素,選擇相對小的元素放入到合并空間斧散,并移動指針到下一位置
*
重復步驟3直到某一指針達到序列尾
*
將另一序列剩下的所有元素直接復制到合并序列尾
*
*
*@paramnumbers
*/
public static voidmergeSort(int[] numbers,intleft,intright) {
intt =1;// 每組元素個數(shù)
intsize = right - left +1;
while(t < size) {
ints = t;// 本次循環(huán)每組元素個數(shù)
t =2* s;
inti = left;
while(i + (t -1) < size) {
merge(numbers, i, i + (s -1), i + (t -1));
i += t;
}
if(i + (s -1) < right)
merge(numbers, i, i + (s -1), right);
}
}
/**
* 歸并算法實現(xiàn)
*
*@paramdata
*@paramp
*@paramq
*@paramr
*/
private static voidmerge(int[] data,intp,intq,intr) {
int[] B =new int[data.length];
ints = p;
intt = q +1;
intk = p;
while(s <= q && t <= r) {
if(data[s] <= data[t]) {
B[k] = data[s];
s++;
}else{
B[k] = data[t];
t++;
}
k++;
}
if(s == q +1)
B[k++] = data[t++];
else
B[k++] = data[s++];
for(inti = p; i <= r; i++)
data[i] = B[i];
}