黑马程序员技术交流社区
标题:
三种简单的排序
[打印本页]
作者:
小米锅巴
时间:
2018-8-28 23:06
标题:
三种简单的排序
本帖最后由 小米锅巴 于 2018-8-29 09:24 编辑
数组学完了可以进行一些排序的练习,在这里介绍最近学习的三种简单的排序方法。 首先是最常见,冒泡排序,第一次比较倒数第一个与倒数第二个比较,较小的换到倒数第二的位置,第二次倒数第二个与倒数第三个比较,较小的向上换,以此类推,第一轮共比较n-1,共比较n-1轮。同时还有一个减少比较次数的小技巧,设置一个boolean型的变量,当某一轮比较直到结束都没发生交换时,变量值设为false,从而结束循环,虽然增加了比较次数,但是减少了后续的比较,综合来说还是提升了性能。代码如下:
public static void
optimizingBubble(
int
[] arr)
{ Boolean flag=
true
;
for
(
int
i =
0
; i < arr.
length
&&flag; i++)
{ flag=
false
;
for
(
int
j = arr.
length
-
2
; j >=i; j--)
{
if
(arr[j]>arr[j+
1
])
{
arr[j]=arr[j]+arr[j+
1
];
arr[j+
1
]=arr[j]-arr[j+
1
];
arr[j]=arr[j]-arr[j+
1
];
flag=
true
;
}
}
}
} 第二个排序是简单选择排序:基本思想为,从第一个值开始,向后比较找到最小的与第一的位置交换,然后从第二个开始向后比较,依此类推,代码如下:
public static void
selectionSort(
int
[] arr)
{
for
(
int
i =
0
; i < arr.
length
; i++)
{
int
min=i;
for
(
int
j = i; j < arr.
length
; j++)
{
if
(arr[min]>arr[j])
{
min=j;
}
}
if
(min!=i)
{
arr
=arr
+arr[min];
arr[min]=arr
-arr[min];
arr
=arr
-arr[min];
}
}
}
第三个排序是简单选择排序,这个排序性能要优于前两种排序,好像Java提供的某种排序方法中用的就是这种排序。基本思想为要排序的位置之前的序列为有序序列,若当前位置中存储的值小于前面的值,则进入循环查找适合自己的位置插入(即前面的数小于自己,后面的数大于自己),依此类推直到数组末尾。这里还有一点要提一下,书中给的数组0位没有值用来做哨兵,但正常情况下数组不会把0位置留出,所以我增加了一个复制数组,将数组长度加一留出0位用作哨兵的过程,此过程不在原排序算法中。代码如下:
public static int
[] straightinsertsort(
int
[] arr)
{
int
[] arr1=
new int
[arr.
length
+
1
];
for
(
int
i =
1
; i < arr1.
length
; i++)
{
arr1
=arr[i-
1
];
}
for
(
int
i =
1
; i < arr1.
length
; i++)
{
if
(arr1[i-
1
]>arr1
)
{
arr1[
0
]=arr1
;
int
j;
for
(j=i-
1
;arr1[j]>arr1[
0
]; j--)
{
arr1[j+
1
]=arr1[j];
}
arr1[j+
1
]=arr1[
0
];
}
}
arr1[
0
]=
0
;
return
arr1;
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2