您的位置:首页 > 编程语言 > C语言/C++

快速排序的Java语言与C语言实现

2016-03-10 13:21 549 查看
C语言版本:

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);
}

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