交换排序
以交换位置的方式排序
冒泡排序
把第一个元素与第二个元素比较,如果第一个比第二个大,则交换他们的位置。接着继续比较第二个与第三个元素,如果第二个比第三个大,则交换他们的位置…
我们对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样一趟比较交换下来之后,排在最右的元素就会是最大的数。
除去最右的元素,我们对剩余的元素做同样的工作,如此重复下去,直到排序完成。
public int[] MySort (int[] arr) {
int n = arr.length;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n-i-1; j++) {
if (arr[j+1]<arr[j]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
return arr;
}
快速排序
从数列中取出一个值,将比这个值大的放在它的右边,将比这个值小的放在它的左边,再最左右两个区域重复这个过程,直到各个区域只有一个数。
具体步骤
- 附设两个指针 left 和 right,它们初始分别指向待排序序列的左端和右端;此外还要附设一个基准元素 pivot(一般选取第一个,本例中初始 pivot 的值为 20)。
- 首先从 right 所指的位置从右向左搜索找到第一个小于 pivot 的元素,然后将其记录在基准元素所在的位置。
- 接着从 left 所指的位置从左向右搜索找到第一个大于 pivot 的元素,然后将其记录在 right 所指向的位置
- 然后再从 right 所指向的位置继续从右向左搜索找到第一个小于 pivot 的元素,然后将其记录在 left 所指向的位置
- 接着,left 继续从左向右搜索第一个大于 pivot 的元素,如果在搜索过程中出现了 left == right ,则说明一趟快速排序结束。此时将 pivot 记录在 left 和 right 共同指向的位置即可
public int[] MySort (int[] arr) {
return quickSort(arr, 0, arr.length - 1);
}
private int[] quickSort(int[] arr, int left, int right) {
if (left < right) {
int pivot = partition(arr, left, right);
// 基准元素左边递归
quickSort(arr, left, pivot - 1);
quickSort(arr, pivot + 1, right);
}
return arr;
}
public static int partition(int[] arr, int left, int right) {
// 选取第一个为基准元素
int pivot = arr[left];
while (left < right) {
/* 先从右往移动,直到遇见小于 pivot 的元素 */
while (left < right && arr[right] > pivot) {
right--;
}
arr[left] = arr[right]; // 记录小于 pivot 的值
/* 再从左往右移动,直到遇见大于 pivot 的元素 */
while (left < right && arr[left] < pivot) {
left++;
}
arr[right] = arr[left]; // 记录大于 pivot 的值
}
arr[left] = pivot; // 记录基准元素到当前指针指向的区域
return left; // 返回基准元素的索引
}