您的位置:首页 > Web前端 > JavaScript

Java&&JavaScript:实现快速排序

2017-08-18 18:05 579 查看
当考虑到时间复杂度的时候,冒泡排序就显得不那么优秀了。而比它优秀的是快速排序。

对于一个长度为n的数组,冒泡排序需要比较(n+1)n/2次,而快速排序需要比较nlogn次。也就是说,冒泡排序的时间复杂度为O(n^2),快速排序的时间复杂度是O(nlogn)。假定有100万个数据,冒泡排序需要比较千亿次,而快速排序只需要比较千万级次。这差距就明显了,随着数据量的加大,快速排序的优势越具有压倒性。

下面,就来看看在java中如何实现快速排序吧

public class ArraySort {

public static void main(String[] args) {
/*
* 快速排序的java实现
*/

// 初始化一个数组
int[] arr = { 23, 43, 12, 34, 54, 23, 65, 23, 76, 123, 34, 77, 22,21 };
// 调用sort方法,排序范围是整个数组
sort(arr, 0, arr.length - 1);
// 打印数组
System.out.println(Arrays.toString(arr));
}

/**
*
*
* 创建日期:2017年8月18日下午4:47:26
*
* 修改日期:
*
* 作者:Lucifer
*
* 功能:对数组进行快速排序
*
* @param arr
*            要排序的数组
* @param startIndex
*            要排序的范围的开始下标
* @param endIndex
*            要排序的范围的结束下标
*/
public static void sort(int[] arr, int startIndex, int endIndex) {
/*
* 套路:
* 1、设置两个变量i,j,在排序开始的时候i=0,j=n-1
* 2、以数组的第一个元素,作为flag,flag=a[0]
* 3、从j开始向前搜索,j--,找到第一个比flag小的,让a[i]和a[j]交换。
* 4、从i开始向后搜索,i++,找到第一个比flag大的,让a[i]和a[j]交换。
* 5、重复3~4的过程,直到i与j相遇为止。
* 6、把分裂开的arr1和arr2,都重复上述过程,直到全部都只剩1个元素为止。
*
*/

//定义两个变量记录开始和结束的下标
int m = startIndex;
int n = endIndex;

//如果startIndex和endIndex相遇,则退出
if(startIndex == endIndex){
return;
}

while (startIndex != endIndex) {
// 从后往前找
for (; endIndex > startIndex; endIndex--) {
// 找到第一个比flag小的,则交换
if (arr[startIndex] > arr[endIndex]) {
// 交换
swap(arr, startIndex, endIndex);
//交换完毕后退出本次循环
break;
}
}

// 从前往后找
for (; endIndex > startIndex; startIndex++) {
// 找到第一个比flag大的,则交换
if (arr[startIndex] > arr[endIndex]) {
// 交换
swap(arr, startIndex, endIndex);
//交换完毕后退出本次循环
break;
}
}
}

/*
* 将数组一分为二
* 左半区为m-startIndex
* 右半区为endIndex-n
* startIndex - 1和endIndex + 1是防止startIndex和endIndex与m和n重合
* 递归执行
*/
if (startIndex - 1 > m) {
sort(arr, m, startIndex - 1);
}
if (endIndex + 1 < n) {
sort(arr, endIndex + 1, n);
}
}

/**
*
*
* 创建日期:2017年8月18日下午5:22:34
*
* 修改日期:
*
* 作者:Lucifer
*
* 功能:交换数组中两个指定下标的元素的值
*
* @param arr
*            执行交换操作的数组
* @param firstIndex
*            要交换的元素的下标
* @param secondIndex
*            要交换的元素的下标
*/
public static void swap(int[] arr, int firstIndex, int secondIndex) {
int temp = arr[firstIndex];
arr[firstIndex] = arr[secondIndex];
arr[secondIndex] = temp;
}

}


然后是JavaScript的代码

var arr = new Array(5, 6,  8, 7, 2, 9, 1, 3, 4);

/*
* 快速排序
*/

/**
* 对数组中的某一段进行快速排序
* @param {Object} arr 要被排序的数组
* @param {Object} startIndex 数组中开始的下标
* @param {Object} endIndex 数组中结束的下标
*/
function sort(arr, startIndex, endIndex) {
var n = startIndex;
var m = endIndex;
if(startIndex == endIndex) {
return;
}

//具体排序逻辑
while(startIndex != endIndex) {
//从后往前找,并且交换
for(; endIndex > startIndex; endIndex--) {
//换
if(arr[startIndex] > arr[endIndex]) {
var temp = arr[startIndex];
arr[startIndex] = arr[endIndex];
arr[endIndex] = temp;

//结束从后往前找
break;
}
}

for(; endIndex > startIndex; startIndex++) {
if(arr[startIndex] > arr[endIndex]) {
var temp = arr[startIndex];
arr[startIndex] = arr[endIndex];
arr[endIndex] = temp;

break;
}
}
}

if(startIndex - 1 > n) {
sort(arr, n, startIndex - 1);
}

if(endIndex + 1 < m) {
sort(arr, endIndex + 1, m);
}
}

sort(arr, 0, arr.length - 1);
document.write(arr);


从上面可以看出,其实,编程语言只是一种工具,从一种语言到另一种语言,只是换换关键字和一些语法,而实际上真正值得学习的是编程思想,解决问题的思想。知道了思想,形成代码就很简单了。特别是掌握了一门编程语言之后,移植就会很容易。难怪听说有人可以一个星期学会一门语言,一通百通罢了。

加油吧,学好java。。。

2017/8/18

Lucifer
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息