排序算法之三交换排序-冒泡排序和快速排序

冒泡排序


(1)基本思想:
在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
(2)实例:


(3)代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* 冒泡排序
* 使用标识位优化排序的执行次数
*/

private static <AnyType extends Comparable<? super AnyType>> void bubbleSort(AnyType[] arr) {
AnyType temp;
boolean flag = true;
for (int i = 0; i < arr.length - 1; ++i) {
flag = true;
for (int j = 0; j < arr.length-i-1; ++j) {
if (arr[j].compareTo(arr[j+1]) > 0) {
flag = false;
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
System.out.println(Arrays.toString(arr));
if (flag) {
break;
}
}
/**
[1, 23, 5, 2, 23, 12, 42]
[1, 5, 2, 23, 12, 23, 42]
[1, 2, 5, 12, 23, 23, 42]
[1, 2, 5, 12, 23, 23, 42]
*/

}

快速排序


转载文章: http://blog.csdn.net/morewindows/article/details/6684558
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想—-分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。
总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速排序,快速搞定。

快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。
虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤。因此我的对快速排序作了进一步的说明:挖坑填数+分治法:
先来看实例吧,定义下面再给出(最好能用自己的话来总结定义,这样对实现代码会有帮助)。

下面的示例就不写了,大家想看的可以去看白话的原文。

直接放出代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* 快速排序
*/

private static <AnyType extends Comparable<? super AnyType>> void quickSort(AnyType[] arr, int start, int end) {
if (start < end) {
int i = adjustArrays(arr, start, end); // 得到基准数的位置
quickSort(arr, start, i - 1); // 递归基准数左边的区间
quickSort(arr, i + 1, end); // 递归基准数右边的区间
}
}

private static <AnyType extends Comparable<? super AnyType>> int adjustArrays(AnyType[] arr, int start, int end) {
int i = start, j = end;
AnyType x = arr[start]; // 基准数x
while (i < j) {
while (i < j && arr[j].compareTo(x) >= 0) {
j--;
}
if (i < j) {
arr[i] = arr[j]; // 将arr[j]填入到arr[i]中,arr[j]形成了新坑
i++;
}
while (i < j && arr[i].compareTo(x) <= 0) {
i++;
}
if (i < j) {
arr[j] = arr[i]; // 将arr[i]填入到arr[j]中,arr[i]形成了新坑
j--;
}
}
//退出时,i等于j。将x填到这个坑中。
arr[i] = x;
return i;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值