快速排序的Java语言与C语言实现
2016-03-10 13:21
549 查看
C语言版本:
Java语言版本:
void sort(int *a, int left, int right) { if(left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/ { return ; } int i = left; int j = right; int key = a[left]; while(i < j)/*i == j时一趟快速排序完成*/ { while(i < j && key <= a[j]) { j--;/*向左寻找*/ } a[i] = a[j]; while(i < j && key >= a[i]) { i++;/*向右寻找*/ } a[j] = a[i]; } a[i] = key;/*当在当组内找完一遍以后就把中间数key回归*/ sort(a, left, i - 1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/ sort(a, i + 1, right);/*用同样的方式对分出来的右边的小组进行同上的做法*/ /*当然最后可能会出现很多份左右小组,直到每一组的i == j为止*/ }
Java语言版本:
public static class QuickSort { //一次划分 private static int partition(int[] arr, int left, int right) { int pivotKey = arr[left]; int pivotPointer = left; while(left < right) {/*left == right 时一趟快速排序完成*/ while(left < right && arr[right] >= pivotKey) right --; while(left < right && arr[left] <= pivotKey) left ++; swap(arr, left, right); //把大的交换到右边,把小的交换到左边。 } swap(arr, pivotPointer, left); //最后把pivot交换到中间(left == right) return left; } private static void quickSort(int[] arr, int left, int right) { if(left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/ return; int pivotPos = partition(arr, left, right); quickSort(arr, left, pivotPos-1); quickSort(arr, pivotPos+1, right); } //这是对外开放的API public static void sort(int[] arr) { if(arr == null || arr.length == 0) return ; quickSort(arr, 0, arr.length-1); } private static void swap(int[] arr, int left, int right) { int temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; } } //其实上面的代码还可以再优化,上面代码中基准数已经在pivotKey中保存了, //所以不需要每次交换都设置一个temp变量,在交换左右指针的时候只需要先后覆盖就可以了。 //这样既能减少空间的使用还能降低赋值运算的次数。优化代码如下: public static class QuickSort { private static int partition(int[] arr, int left, int right) { int pivotKey = arr[left]; while(left < right) { while(left < right && arr[right] >= pivotKey) right --; arr[left] = arr[right]; //把小的移动到左边 while(left < right && arr[left] <= pivotKey) left ++; arr[right] = arr[left]; //把大的移动到右边 } arr[left] = pivotKey; //最后把pivot赋值到中间 return left; } private static void quickSort(int[] arr, int left, int right) { if(left >= right) return ; int pivotPos = partition(arr, left, right); quickSort(arr, left, pivotPos-1); quickSort(arr, pivotPos+1, right); } //这是对外开放的API public static void sort(int[] arr) { if(arr == null || arr.length == 0) return ; quickSort(arr, 0, arr.length-1); } }
相关文章推荐
- 使用Visual Studio编译MYSQL CONNECTOR C/C++(MYSQLCPPCONN)
- 【c++】菱形虚拟虚拟继承模型探索
- C++封装 mysql C api遇到的问题
- C++11:如何判断一个类是另一个模板类的子类?
- C++总结之const限定符
- 《c语言全局变量的用法》
- Problem B: C语言习题 学生成绩输入和输出
- Problem A: C语言习题 计算该日在本年中是第几天
- C语言试题记录
- C++类复制构造函数参数为nonconst和const的重载
- C/C++获取当前系统时间
- C++上机报告-2
- C++第1次上机作业
- c++第一次实验-4
- C++第一次实验项目3
- c语言学习笔记 指针相关
- C++第一次上机实验报告-2
- C++第一次实验-1
- c++第1次上机实验-3
- c++第1次上机3-2