冒泡、選擇、快速排序

/**
 * 排序
 * @author Administrator
 *
 */
public class Sort {
public static void main(String args[])
{
int[] t = {3,6,9,2,7,1,3,8,5,1,56,122,432,142,1,40,0,1234,33,31,12};
//冒泡排序——先排最後那一個元素
//mpSort(t);
//選擇排序——先排開始那一個元素
//xzSort(int[] data);
//快速排序——先排中間那一個元素
ksSort(t,0,t.length-1);

for(int i=0;i<t.length;i++){
System.out.print(t[i]+" ");
}
}

/**
* 冒泡排序,逐一比較後交互位置,最大的在後面
* @param str
* @return
*/
public static void mpSort(int[] data){
if(data.length>1){
for(int i=1;i<data.length;i++)
{
for(int j=0;j<data.length-i;j++){
if(data[j]>data[j+1])
{
int d = data[j];
data[j] = data[j+1];
data[j+1] = d;
}
}
}
}

}


/**
* 選擇排序
* 把最小的放前面
*/
public static void xzSort(int[] data)
{
for(int i=0;i<data.length-1;i++)
{
for(int j=i+1;j<data.length;j++)
{
if(data[i]>data[j])
{
int d = data[i];
data[i] = data[j];
data[j] = d;
}
}
}
}


/**
* 快速排序【原理:選定一個元素,
* 從i=開始位置找(i++),找到一個大於指定元素的
* 從j=結束位置找(j--),找到一個小於指定元素的
* 然後兩個元素交換位置,然後繼續找,繼續交換,
* 當i>j時,一輪排序結束。
* data[j]和選定的元素交換位置,則j位置前面的值都比data[j]小,後面的都比data[j]大,
* 分成兩部分【1:0到j-1  2:j+1到data[j].length 此時的j是拍好序的,所以不需要排了】 
* 然後兩部分進行遞歸
* @param data 數組
* @param middle 排序起始位置
* @param end 排序結束位置
*/
public static void ksSort(int[] data,int middle,int end)
{
//如果最大值小於等於0,表明沒有元素可以比較了
//如果最小值大於等於最大值,表明沒有元素可以比較了
if(end<=0||middle>=end) return; 

int i = middle; //排序起始位置【由於middle和end是基本變量,所以改變i和j不會影響到它們的值】
int j = end; //排序結束位置
//開始循環,出口條件爲i>j,表明一輪排序的結束
while(true)
{
//找出大於data[middle]的值的元素的位置
while(i<=end && data[i]<=data[middle]){
i++;
}
//最後出來是i=end+1【如果i=end,那麼無法識別最後一個元素是大於、小於還是等於data[middle]】

//找出小於data[middle]的值的元素的位置
while(j>=i && data[j]>=data[middle]){
j--;
}
//System.out.println("i:"+i+" j:"+j);

if(i>j) break; 

int d = data[i];
data[i] = data[j];
data[j] = d;

}
//打印出這一輪比較的開始和結束位置
//System.out.println(" middle:"+middle+" end:"+end);

//此時i指向的是大於data[middle]的元素
//此時j指向的是小於data[middle]的元素
//所以將data[middle]和data[j]的元素交換
//交互之後data[j]的值就比前面的都小,比後面的都大了
int k = data[middle];
data[middle] = data[j];
data[j] = k;

/*
//打印每一輪排序後的數組
for(int m = 0;m<data.length;m++){
System.out.print(data[m]+" ");
}
System.out.println("");
*/

ksSort(data,middle,j-1);
ksSort(data,j+1,end);
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章