冒泡、选择、快速排序

来源:互联网 发布:韩国讲网络暴力的电影 编辑:程序博客网 时间:2024/05/21 09:41
/**
 * 排序
 * @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);
}
}