Java&&JavaScript:实现快速排序
2017-08-18 18:05
579 查看
当考虑到时间复杂度的时候,冒泡排序就显得不那么优秀了。而比它优秀的是快速排序。
对于一个长度为n的数组,冒泡排序需要比较(n+1)n/2次,而快速排序需要比较nlogn次。也就是说,冒泡排序的时间复杂度为O(n^2),快速排序的时间复杂度是O(nlogn)。假定有100万个数据,冒泡排序需要比较千亿次,而快速排序只需要比较千万级次。这差距就明显了,随着数据量的加大,快速排序的优势越具有压倒性。
下面,就来看看在java中如何实现快速排序吧
然后是JavaScript的代码
从上面可以看出,其实,编程语言只是一种工具,从一种语言到另一种语言,只是换换关键字和一些语法,而实际上真正值得学习的是编程思想,解决问题的思想。知道了思想,形成代码就很简单了。特别是掌握了一门编程语言之后,移植就会很容易。难怪听说有人可以一个星期学会一门语言,一通百通罢了。
加油吧,学好java。。。
2017/8/18
Lucifer
对于一个长度为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
相关文章推荐
- 快速排序Java实现和Javascript实现
- 学习笔记:快速排序的C++、JavaScript(2种方法)、Java实现
- Java实现排序(快速排序、冒泡排序、选择排序、基数排序、插入排序)
- 快速排序方法Java实现与分析
- 快速排序java实现
- 【转】排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序
- 快速排序(Quicksort)的Javascript实现
- 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- 快速排序--Java实现
- javascript实现快速排序
- java实现的冒泡、选择、快速排序
- java实现快速排序
- 【排序系列】快速排序java实现
- 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- 排序算法复习(Java实现)(二): 插入,冒泡,选择,Shell,快速排序
- java实现快速排序
- 快速排序Java实现
- Java实现快速排序、归并排序、堆排序
- Java下实现快速排序