交换排序
算法中最基础的当数排序了,今天整理记录一下Java中的交换排序。
这里的排序方式按从小到大讲,由大到小其实就是改变下符号。
交换排序有两种实现方式:
一、冒泡排序
二、快速排序
以下内容纯属个人理解,如有不对,欢迎评论指正!
接下来先讲讲冒泡排序:
一、冒泡排序
冒泡排序,顾名思义就像水底的泡泡向上冒出一样,由小到大(水压问题)。
在排序的过程中,要循环把最小的值排到最前面;这样就会有一种思路:
1、冒泡一次就会通过不断交换位置的方式把序列中最小的值排到最前面;
2、下次冒泡时就会从上次位置的后一位开始;
3、这样就会有第k次冒泡要遍历 n-k 个元素;
4、共循环冒泡 n - 1 次。
代码实现
public void bubbleSort(int[] elements){
int length = elements.length;
for (int j = length; j > 1; j--) { //利用外层循环控制每次排序的元素个数
for (int i = 1; i < j; i++) { // 利用内层循坏完成元素的排序
if (elements[i] < elements[i - 1]){
int temp = elements[i - 1];
elements[i - 1] = elements[i];
elements[i] = temp;
}
}
}
}
二、快速排序
快速排序,使用**双指针**方式,①先移动右指针遍历到比**基数**小的值就将该值移动到左指针指向的元素并停止遍历,②然后左指针遍历到比基数大的值就将该值移动到右指针指向的元素并停止遍历;重复①②操作,直至两个指针重合,这时交换指针指向的元素和基数;将指针指向的位置将序列分成左右两个个序列,每个序列重复上述所有步骤。 > 双指针:其实就是两个变量,记录元素的位置。 > 基数:一般为序列的第一个值;这样就决定了要从右指针开始移动,因为要保证当左右指针重合时指向的元素要比基数小。代码实现
public void quickSort(int[] elements, int left, int right){
if (left >= right){ //左右指针重合
return;
}
int pivotPos = partition(elements, left, right);//移动左右指针
quickSort(elements, left, pivotPos - 1); // 左侧序列重复上述步骤
quickSort(elements, pivotPos + 1, right); // 右侧序列重复上述步骤
}
private int partition(int[] elements, int left, int right) {
int pivotKey = elements[left]; // 得到基数,序列的第一个元素
while (left < right){ // 左右指针是否重合
while (left < right && elements[right] >= pivotKey) //右指针指向的值是否比基数大
right--;
elements[left] = elements[right]; // 将右指针指向的元素移动到左指针指向的元素
while (left < right && elements[left] <= pivotKey) //左指针指向的值是否比基数小
left++;
elements[right] = elements[left]; //将左指针指向的元素移动到右指针指向的元素
}
elements[left] = pivotKey; // 将基数移动到左右指针重合的位置
return left; //返回左右指针重合的位置
}