本文介绍常见的排序编程题
冒泡排序
思路:双层循环嵌套,比较并交换
public static int[] sort(int[] array) {
//需要多少轮比较(N-1)
for (int i = 1; i < array.length; i++) {
//每轮需要参与比较的元素下标(N-1-i)
for (int j = 0; j < array.length - i; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j+1] = temp;
}
}
}
return array;
}
快速排序
- 快速排序一般基于递归实现。其思路是这样的:
- 1.选定一个合适的值(理想情况中值最好,但实现中一般使用数组第一个值),称为“枢轴”(pivot)。
- 2.基于这个值,将数组分为两部分,较小的分在左边,较大的分在右边。
- 3.可以肯定,如此一轮下来,这个枢轴的位置一定在最终位置上。
- 4.对两个子数组分别重复上述过程,直到每个数组只有一个元素。
- 5.排序完成。
public static void quickSort(int[] arr) {
qsort(arr, 0, arr.length - 1);
}
private static void qsort(int[] arr, int low, int high) {
if (low < high) {
int pivot = partition(arr, low, high); //将数组分为两部分
qsort(arr, low, pivot - 1); //递归排序左子数组
qsort(arr, pivot + 1, high); //递归排序右子数组
}
}
private static int partition(int[] arr, int low, int high) {
int pivot = arr[low]; //枢轴记录
while (low < high) {
while (low < high && arr[high] >= pivot) {
--high;
}
arr[low] = arr[high]; //交换比枢轴小的记录到左端
while (low < high && arr[low] <= pivot) {
++low;
}
arr[high] = arr[low]; //交换比枢轴小的记录到右端
}
//扫描完成,枢轴到位
arr[low] = pivot;
//返回的是枢轴的位置
return low;
}
二分查找
使用条件:查找序列是顺序结构,有序
使用递归实现
public static int recursionBinarySearch(int[] arr,int key,int low,int high){
if(key < arr[low] || key > arr[high] || low > high){
return -1;
}
int middle = (low + high) / 2; //初始中间位置
if(arr[middle] > key){
//比关键字大则关键字在左区域
return recursionBinarySearch(arr, key, low, middle - 1);
}else if(arr[middle] < key){
//比关键字小则关键字在右区域
return recursionBinarySearch(arr, key, middle + 1, high);
}else {
return middle;
}
}
不使用递归实现(while循环)
public static int commonBinarySearch(int[] arr,int key){
int low = 0;
int high = arr.length - 1;
int middle = 0; //定义middle
if(key < arr[low] || key > arr[high] || low > high){
return -1;
}
while(low <= high){
middle = (low + high) / 2;
if(arr[middle] > key){
//比关键字大则关键字在左区域
high = middle - 1;
}else if(arr[middle] < key){
//比关键字小则关键字在右区域
low = middle + 1;
}else{
return middle;
}
}
return -1; //最后仍然没有找到,则返回-1
}