java语言基础——排序算法

排序的分类:

选择排序(直接选择排序,堆排序)
交换排序(冒泡排序,快速排序)
插入排序(直接插入排序,二分法插入排序,Shell排序)
归并排序

排序有升序排序和降序排序之分,我们现在单讲升序排序。我们主要讲解冒泡,选择,插入排序,当然在开发中因为性能问题,我们都不会自己写排序算法,排序在笔试题中却是常客。

实例:

若有下列int类型数组需要排序:
int[] arr={2,9,6,7,4,1};

1.冒泡排序
这是最简单的排序法,基本思路如下:

对未排序的元素从头到尾依次比较相邻的两个元素的大小关系,若大于则交换位置,经过第一轮选择排序后可得出最大值,然后使用同样的方法把剩下的元素逐个比较即可。可以看出若有N个元素,那么只需要进行N-1轮比较,第M轮要进行N-M次比较(若6个元素,要进行6-1轮比较,第一轮比较6-1次,第二轮比较6-2次)。

//数组的冒泡排序
class ArraySortDemo
{
public static void main(String[] args)
{
int[] arr={2,9,6,7,4,1};
printArray[arr];//[2,9,6,7,4,1]
bubbleSort[arr];//排序
printArray[arr];//[1,2,4,6,7,9]
}
//交换值
static void Swap(int[] arr,int index1,int index2) {
    int temp=arr[index1];
    arr[index1]=arr[index2];
    arr[index2]=temp;
}
//冒泡排序
static void bubbleSort(int[] arr){
/*第一轮,最大值排在最后
for(int i =1;i<=arr.length-1;i++)
{
if(arr[i-1]>arr[i])
{
swap(arr,i-1,i);
}
}*/
/*第二轮,第二大值排在倒数第二
for(int i =1;i<=arr.length-2;i++)
{
if(arr[i-1]>arr[i])
{
swap(arr,i-1,i);
}
}*/
for(int times =1;times<=arr.length-1;times++)
{
 for(int i =1;i<=arr.length-times;i++)
{
if(arr[i-1]>arr[i])
{
swap(arr,i-1,i);
}
}
}
//打印出来
static void printArray(int[] arr) {
    if(arr==null) {
        System.out.println("null");
        return;
        }
    String ret="[";
    for(int index=0;index<arr.length;index++) {
        ret+=arr[index];
        //如果当前index不是最后一个索引,则拼接“,”
        if(index!=arr.length-1) {
            ret=ret+",";
            }
        }
     ret=ret+"]";               
     System.out.println(ret);
    }
}

写循环语句时,可以通过几轮执行来找到循环规律,这样能够避免出错。

2.选择排序
基本思路
选择某个索引位置的元素,然后和后面元素依次比较,若大于则交换位置,经过第一轮比较排序后可得出最小值,然后使用相同的方法把剩下的元素逐个比较即可。

可以看出选择排序,第一轮会选出最小值,第二轮会选出第二个小的值,直到最后。第一轮从arr[0]和后面元素比较,第二轮从arr[1]和后面的元素相比较,以此类推。N个数要进行N-1轮。选择排序每一轮只进行一次交换,相当于冒泡排序效率高一些。

class ArraySortDemo
{
public static void main(String[] args)
{
int[] arr={2,9,6,7,4,1};
printArray[arr];//[2,9,6,7,4,1]
selectionSort[arr];//排序
printArray[arr];//[1,2,4,6,7,9]// 前面写过printArray()
}
//选择排序
static void selectionSort(int[] arr){
/*第一轮
for(int i=1;i<=arr.length-1;i++)
{
if(arr[0]>arr[1])
{  swap(arr,0,i);
}
}*/
/*第二轮
for(int i=2;i<=arr.length-1;i++)
{
if(arr[1]>arr[1])
{  swap(arr,1,i);
}
}*/
 for(int times=1;times<=arr.length-1;times++)
 {
    for(int i=times;i<=arr.length-1;i++)
    {
      if(arr[times-1]>arr[times])
      {  
         swap(arr,times-1,i);//前面写过swap()
      }
    }
  }
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值