常用排序与查找

参考文献http://www.cnblogs.com/xwz0528/p/4557743.html

冒泡排序(交换排序)

public class Demo12 {

public static void main(String[] args) {

// 冒泡排序

int[] arr = {34,1,78,9,43};

int temp;

for(int i = 0 ; i < arr.length-1;i++) {//轮

for(int j = 0; j < arr.length-1-i; j++) {//次

            if(arr[j] > arr[j+1]) {

                temp = arr[j];

                arr[j]= arr[j + 1];

                arr[j + 1] = temp;

            }
        }       

}
for(int n: arr) {
System.out.println(n);
}
}
}

选择排序

import java.util.Arrays;

public class Demo13 {

public static void main(String[] args) {

// 选择排序

int [] arr = {5,12,3,78,345};

int temp;

for(int i = 0; i < arr.length-1; i++) {//位置

for(int j = i + 1; j < arr.length; j++) {

            if(arr[i] > arr[j]) {

                temp = arr[i];

                arr[i] = arr[j];

                arr[j] = temp;

            }

}

}

for(int n:arr) {

System.out.println(n);

}

//
System.out.println(Arrays.toString(arr));

}

}

小顶堆(堆排序)

堆的定义、堆的存储、堆排序

输出堆顶元素(因为它是最值),将堆顶元素和最后一个元素交换,然后从堆顶向下调整

堆排序是一种树形选择排序方法,它的特点是,在排序过程中,将L[1…n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系,在当前无序区中选择关键字最大(或最小)的元素。

堆的定义如下:

n个关键字序列L[1…n]称为堆,当且仅当该序列满足:① L(i)≤L(2i) 且 L(i)≤L(2i+1) 或 ② L(i)≥L(2i) 且 L(i)≥L(2i+1),其中1≤i≤⌊n/2⌋。

满足情况①的堆称为小根堆,满足情况②的堆称为大根堆。堆的含义表明,完全二叉树中所有非终端结点的值均不大于(或不小于)其左、右孩子结点的值。

堆排序和堆排序 Heap Sort中的实现都挺好的,前者中HeapAdjust用递归实现,后者HeapAdjust采用非递归实现。下面把他们分别贴出

/堆排序(大顶堆) 2011.9.14/

#include

#include

using namespace
std;

void
HeapAdjust(int *a,int i,int size) //调整堆

{

int lchild=2*i;       //i的左孩子节点序号 

int rchild=2*i+1;     //i的右孩子节点序号 

int max=i;            //临时变量 

if(i<=size/2)          //如果i是叶节点就不用进行调整 

{

if(lchild<=size&&a[lchild]>a[max])

    {

        max=lchild;

    }   

if(rchild<=size&&a[rchild]>a[max])

    {

        max=rchild;

    }

    if(max!=i)

    {

        swap(a[i],a[max]);

        HeapAdjust(a,max,size);    //避免调整之后以max为父节点的子树不是堆 

    }

}       

}

void
BuildHeap(int *a,int size) //建立堆

{

int i;

for(i=size/2;i>=1;i--)    //非叶节点最大序号值为size/2 

{

    HeapAdjust(a,i,size);    

}    

}

void
HeapSort(int *a,int size) //堆排序

{

int i;

BuildHeap(a,size);

for(i=size;i>=1;i--)

{

    //cout<<a[1]<<"

";

    swap(a[1],a[i]);           //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面 

      //BuildHeap(a,i-1);        //将余下元素重新建立为大顶堆 

      HeapAdjust(a,1,i-1);      //重新调整堆顶节点成为大顶堆

}

}

int main(int
argc, char *argv[])

{

 //int a[]={0,16,20,3,11,17,8};

int a[100];

int size;

while(scanf("%d",&size)==1&&size>0)

{

    int i;

    for(i=1;i<=size;i++)

        cin>>a[i];

    HeapSort(a,size);

    for(i=1;i<=size;i++)

cout<<a[i]<<"";

    cout<<endl;

}

return 0;

}

快排

二分查找

public class binarySearch {

public static void main(String[] args) {

int[] arr = {9,12,15,24,36,41,59,68};

int num =searchArray(arr,12);

System.out.println(num);

}

//二分查找。前提:数组必须是有序的。

/*

  • 思路:

  • 1.通过角标先获取中间角标上的元素

  • 2.让该元素和要找的数据比较。

  • 3.如果要找的数大了,缩小范围,要找的范围应该是 中间的角标+1—尾角标

  • 如果要找的数效率,要找的范围 头角标—中间角标-1。

  • 4.不断如此重复,就可以找到元素对应的角标。

  • */

public static int searchArray(int[] arr,int key) {

int max,min,mid;

min = 0;

max = arr.length-1;

mid = (min+max)>>1;

while(arr[mid]!=key) {

if(key > arr[mid]) {

            min = mid + 1;

}else{

            max = mid - 1;

}

//判断元素是否存在。

if(max<min) {

            return -1;

}

mid = (min+max)>>1;

}

return mid;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值