java中排序算法 快速排序_必须知道的八大种排序算法【java实现】(一) 冒泡排序、快速排序...

冒泡排序

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

冒泡排序的示例:

1342782078_9990.jpg

冒泡排序的算法实现如下:【排序后,数组从小到大排列】

/*** 冒泡排序

* 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

* 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

* 针对所有的元素重复以上的步骤,除了最后一个。

* 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

*@paramnumbers 需要排序的整型数组*/

public static void bubbleSort(int[] numbers)

{int temp = 0;int size =numbers.length;for(int i = 0 ; i < size-1; i ++)

{for(int j = 0 ;j < size-1-i ; j++)

{if(numbers[j] > numbers[j+1]) //交换两数位置

{

temp=numbers[j];

numbers[j]= numbers[j+1];

numbers[j+1] =temp;

}

}

}

}

快速排序

快速排序的基本思想:

通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序。

快速排序的示例:

(a)一趟排序的过程:

1342782317_4426.jpg

(b)排序的全过程

1342782329_8314.jpg

把整个序列看做一个数组,把第零个位置看做中轴,和最后一个比,如果比它小交换,比它大不做任何处理;交换了以后再和小的那端比,比它小不交换,比他大交换。这样循环往复,一趟排序完成,左边就是比中轴小的,右边就是比中轴大的,然后再用分治法,分别对这两个独立的数组进行排序。

代码实现如下:

1.查找中轴(最低位作为中轴)所在位置

/*** 查找出中轴(默认是最低位low)的在numbers数组排序后所在位置

*

*@paramnumbers 带查找数组

*@paramlow 开始位置

*@paramhigh 结束位置

*@return中轴所在位置*/

public static int getMiddle(int[] numbers, int low,inthigh)

{int temp = numbers[low]; //数组的第一个作为中轴

while(low

{while(low < high && numbers[high] >temp)

{

high--;

}

numbers[low]= numbers[high];//比中轴小的记录移到低端

while(low < high && numbers[low]

{

low++;

}

numbers[high]= numbers[low] ; //比中轴大的记录移到高端

}

numbers[low]= temp ; //中轴记录到尾

return low ; //返回中轴的位置

}

2、 递归形式的分治排序算法:

/***

*@paramnumbers 带排序数组

*@paramlow 开始位置

*@paramhigh 结束位置*/

public static void quickSort(int[] numbers,int low,inthigh)

{if(low

{int middle = getMiddle(numbers,low,high); //将numbers数组进行一分为二

quickSort(numbers, low, middle-1); //对低字段表进行递归排序

quickSort(numbers, middle+1, high); //对高字段表进行递归排序

}

}

3、快速排序提供方法调用

/*** 快速排序

*@paramnumbers 带排序数组*/

public static void quick(int[] numbers)

{if(numbers.length > 0) //查看数组是否为空

{

quickSort(numbers,0, numbers.length-1);

}

}

分析:

快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。为改进之,通常以“三者取中法”来选取基准记录,即将排序区间的两个端点与中点三个记录关键码居中的调整为支点记录。快速排序是一个不稳定的排序方法。

方法测试

打印函数:

public static void printArr(int[] numbers)

{for(int i = 0 ; i < numbers.length ; i ++)

{

System.out.print(numbers[i]+ ",");

}

System.out.println("");

}

测试:

public static voidmain(String[] args)

{int[] numbers = {10,20,15,0,6,7,2,1,-5,55};

System.out.print("排序前:");

printArr(numbers);

bubbleSort(numbers);

System.out.print("冒泡排序后:");

printArr(numbers);

quick(numbers);

System.out.print("快速排序后:");

printArr(numbers);

}

结果:

排序前:10,20,15,0,6,7,2,1,-5,55,

冒泡排序后:-5,0,1,2,6,7,10,15,20,55,

快速排序后:-5,0,1,2,6,7,10,15,20,55,

致谢:感谢您的耐心阅读!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值