冒泡排序的核心部分事双重嵌套循环,不难看出时间复杂度为O(N^2),这是一个非常高的时间复杂度。
原理很简单,直接看代码:
import
java.util.Scanner;
public
class
MaopaoPaixu {
public
static
void
main(String[] args) {
Scanner cin =
new
Scanner(System.
in
);
int
n = cin.nextInt();
int
i , j ,temp;
int
array[] =
new
int
[n];
for
(i = 0; i < n; i++) {
array[i] = cin.nextInt();
}
cin.close();
//冒泡排序核心代码
for
( i = 0; i < n-1; i++) {
//冒泡n-1趟,n为排序数组的元素个数
for
(j = 0; j < n-1-i; j++) {
//j第一趟从第一个元素到倒数第二个元素
if
(array[j]>array[j+1]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
for
(i = 0; i< n; i++) {
System.
out
.print(array[i]+
" "
);
}
}
}
快速排序是最常用的排序,每一轮处理就是选定一个基准数,让比它小的数字放在左边,比它大的数字放在其右边,直到所有的数都归位,排序就结束了。
快速排序之所以比冒泡排序快,是因为每次交换都是跳跃式的,每次排序的时候设置一个基准点,小于等于基准点的数全部放在基准点的左边,将大于等于基准点的数全部放到基准点的右边,这样在每次交换的时候就不会冒泡排序一样只能在相邻的数之间进行交换,交换的距离就大得多了。因为总的比较和交换次数变少了,速度自然就提高了。当然,在最坏的情况下,仍然可能是相邻的两个数进行交换,因此快速排序的最差时间复杂度是和冒泡排序是一样的,都是O(N^2),它的平均时间复杂度为O(NlogN)。
Java程序代码,亲测
import
java.util.Scanner;
public
class
KuaisuPaixu {
static
int
a
[] =
new
int
[101];
//定义全局变量,这两个变量需要在子函数中使用
static
int
n
;
public
static
void
main(String[] args) {
int
i;
Scanner cin =
new
Scanner(System.
in
);
n
= cin.nextInt();
for
(i = 0; i <
n
; i++) {
a
[i] = cin.nextInt();
//输入数组长度和数组
}
cin.close();
quicksort(0,
n
-1);
//快速排序调用
for
(i = 0; i <
n
; i++) {
System.
out
.print(
a
[i]+
" "
);
//输出结果
}
}
public
static
void
quicksort(
int
left,
int
right){
int
i,j,t,temp;
if
(left > right)
return
;
temp =
a
[left];
//temp中存的就是基准数
i = left;
j = right;
while
(i != j){
while
(
a
[j] >= temp && i < j)
//顺序很重要,先从右往左找
j--;
while
(
a
[i] <= temp && i < j)
//从左往右找
i++;
if
(i < j){
//交换连个数在数组中的位置,i<j代表哨兵i和哨兵j没有相遇
t =
a
[i];
a
[i] =
a
[j];
a
[j] = t;
}
}
a
[left] =
a
[i];
//基准数归位
a
[i] = temp;
quicksort(left,i-1);
//递归处理左边的数
quicksort(i+1,right);
//递归处理右边的数
}
}
示例题:
学校要建立一个图书角,小哼让每个同学写出一个自己最想读的书的ISBN号(每本书都有唯一的ISBN号),有一些好书会有很多同学喜欢,这样就会收集到很多重复的ISBN号,小哼药去掉重复的ISBN号,每个ISBN号只能保留一个,也就是说同样的书只卖一本。然后再把这些ISBN号从小到大排序,小哼讲按照排序号的ISBN号去书店买书。请你协助小哼完成“去重”和“排序”。
输入有2行,第一行为一个正整数,表示有n个同学参与调查(n<=100),第二行有n个空格隔开的正整数,为每本图书的ISBN号(假设图书的IBSN号在1~1000)。
输出有2行,第一行为一个正整数k,表示需要买多少本书,第二行为k个用空格隔开的正整数,为从小到大已排好序的需要购买的图书的IBSN号。
例如输入:
10
20 40 32 67 40 20 89 300 400 15
输出:
8
15 20 32 40 67 89 300 400
第一种方法:
先将n个图书的ISBN号去重。再进行从小到大的排序;可以借助桶排序解决此问题
Java代码如下:
import
java.util.Scanner;
public
class
exampleBuyBooks {
public
static
void
main(String[] args) {
Scanner cin =
new
Scanner(System.
in
);
int
n = cin.nextInt();
int
a[] =
new
int
[1001];
//初始化桶
int
t, j=0;
for
(
int
i = 0; i < n; i++) {
t=cin.nextInt();
if
(a[t]==0){
a[t] = 1;
//标记桶,桶号对应ISBN号
j++;
//j表示有多少个桶被标记,即去重后的书本数
}
}
cin.close();
System.
out
.println(j);
for
(
int
i = 0; i < 1001; i++) {
if
(a[i]==1)
//将被标记的桶打印出来
System.
out
.print(i+
" "
);
}
}
}
第二种方法:先排序再去重
import
java.util.Scanner;
//第二种方法:先排序再去重
public
class
exampleBuyBooks2 {
public
static
void
main(String[] args) {
Scanner cin =
new
Scanner(System.
in
);
int
n = cin. nextInt();
int
temp,k=1;
int
a[] =
new
int
[101];
for
(
int
i = 0; i < n; i++) {
a[i] = cin.nextInt();
}
cin.close();
//使用冒泡排序
for
(
int
i = 0; i < n; i++) {
for
(
int
j = 0; j < n-1-i; j++) {
if
(a[j] > a[j+1]){
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
//输出ISBN号,去重
for
(
int
i = 1; i < n; i++) {
if
(a[i] != a[i-1])
k++;
//k代表去重后的书本数
}
System.
out
.println(k);
System.
out
.print(a[0]+
" "
);
for
(
int
i = 1; i < n; i++) {
if
(a[i] != a[i-1])
//i从1开始否则i-1会出现数组越界异常
System.
out
.print(a[i]+
" "
);
}
}
}