您的位置:首页 > 编程语言 > Java开发

Java实现排序算法1:5种易理解的算法

2016-03-30 23:22 399 查看
今天下班回到学校,突然想起自己平时学习还有过有一些笔记,乱七八糟的,有必要整理一下,顺便也能够复习。就用这篇排序算法作为我CSDN博客的开端,也算是我对自己学习的一种纪录吧。刚开始可能会写得有些稀烂,以后会逐渐改进。出现错误的话,也希望浏览到的朋友提出来,谢谢。

关于排序我会写一个系列,主要是会是各种排序算法的实现,时空复杂度的比较等等,这篇文章里先介绍五种比较简单的排序:冒泡排序,快速排序,直接插入排序,希尔排序和简单选择排序。

public  bubbleSort(){
int []a = {10,8,15,23,17,6,14,20};
for(int i = 0; i <a.length() - 1; i++){
for(int j = 0; j <a.length()-1-i; j++){
if(a[j] > a[j+1]){
int temp = a[j+1];
a[j+1] = a[j];
a[j] = temp;
}
}
}
for(int i = 0; i<a.length(); i++){
System.out.printLn(a[i]);
}
}


快速排序的思想:选取数组的第一个或者最后一个数为基准数据,设置两个索引i和j,假设我选取最后一个数basic为基准数据,将数组中比basic小的数放在它的左边,将比basic大的数放在它的右边,然后递归下去,就能得到最终的排序结果。具体是如何实现的呢?假设我有10个数,那么设置两个索引i和j,i= 0,j = 9,选取最后一位是基准数据basic,然后把这个位置挖空,将basic存起来(X = basic)。从前往后找比basic大的数(i++),然后找到第一个后,我们就把这个数放到原来basic的位置上,也就是被挖空的位置上。然后这个位置就被挖空了,i就停在了这个位置的索引上,然后我们再去从后向前找比basic小的数,也就是j--,找到第一个就放到刚才被挖空的位置上,然后如此反复,直到i=j,那么目的就达到了,也就是数组中比basic小的数放在它的左边,将比basic大的数放在它的右边,然后依次递归即可。
这一部分代码:


public  void  getMiddle(int[] a, int i, int j)
{
int x = a[j];
while(i < j){
while(i < j && a[i] <= x){
i++;
}
a[j] = a[i];
while(i < j && a[j] >= x){
j--;
}
a[i] = a[j];
}
a[j] = x;
return j;
}


然后是使用递归对分治部分的一个简单实现:

public quickSort(int[] a, int low, int high){
int middle = getMiddle(a, low, high);
quickSort(a, low, middle-1);
quickSort (a, moddle +1, high);
}


直接插入排序是最直白的一种,自然效率上就不会太高。关于时空复杂度,在把所有的排序实现后

会专门写一篇:

插入排序的方法就是:对一个数组,先对第一个数据元素排序,然后对第一和第二个排序(也

就是把第二个插入到其中),然后把第三个插入到第一个和第二个组成的数组中排序(此时已

经排好序),以此类推下去。

至于如何实现,简单的不要不要的:

public void insert(){
int[] a ={...};
for(int i = 1; i<= a.length; i++){
int temp = a[i];
for(int j = i-1; j >= 0 && a[j] > temp; j--){
a[j+1] = a[j];
}
a[j+1] = temp;
}
for(int i = 0; i<a.length(); i++){
System.out.println(a[i]);
}
}


希尔排序是插入排序的改进版,其核心思路是,先将数组进行分组使用直接插入排序,比如:假设

一个数组有10个元素,以d = 10/2为间隔做插入排序,然后以d/2 为间隔做插入排序,如此反复直

至d=1。此时的数组接近最好状态,然后做最后一次插入排序。效率提高之处在于插入排序在数组接

近最好状态(几乎已经排好序的情况下)时,效率非常高。

具体实现:

public class  ShellSort{
int[] a = {...};
int d = Math.ceil(a.length/2);

public void shell(){
for(int i = 0; i<d; i++){
for(int j =i+d; j<a.length; j+=d){
int temp = a[j];
for(int k =j-d; k >= 0&& a[k] > temp; k -=d){
a[k+d] = a[k];
}
a[k+d] = temp;
}
d = Math.ceil(d/2);
}
for(int i =0; i <a.length; i++){
System.out.println(a[i]);
}
}
}


简单选择排序则又是另一种易于理解的排序方式。思路就是:在数组中选择最小的数,

然后将其与第一个位置上的数交换,然后从第二个数开始找出最小的,和第二个位置

上的数交换,依次进行下去就能得到最终的排序结果。

核心部分:

for(int i = 0; i<a.length; i++){
int temp = a[i];
for(int j =i+1; j<a.length && a[j] <temp; j++){
temp =a[j];
}
a[i] = temp;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: