数据结构

来源:互联网 发布:淘宝网站数据下载方法 编辑:程序博客网 时间:2024/06/06 12:31

查找

二分查找:二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:
    1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,
    2.寻找{6, 7, 8, 9}的中位数,为77>6,则6应该在7左边的数组元素中,那么只剩下6,即找到了。

public static int binarysearch(int value,int size){

int middle = 0;

int low = 0;

int pow = size;

while(low>pow)){

middle = (low + pow)/2;

if(arr[middle] == value){

return middle;

}else if (arr[middle]>value) {

pow = middle;

}else if{

pow = middle;

}

}

return -1;

}

 

排序

冒泡排序:把最小的往上冒,就像冒泡一样的。

大的往后冒泡

1比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在第一趟,最后的元素应该会是最大的数。

3针对所有的元素重复以上的步骤,除了最后一个。

public void sort(int[] a)

    {int temp = 0;

        for (int i = a.length - 1; i > 0; --i)

        {

            for (int j = 0; j < i; ++j)

            {

                if (a[j] > a[j+1])

                {

                    temp = a[j];

                    a[j] = a[j + 1];

                    a[j + 1] = temp;

                }

            }

        }

    }

选择排序

设数组为a[0n-1]

1. 初始时,数组全为无序区为a[0..n-1]。令i=0

2. 在无序区a[in-1]中选取一个最小的元素,将其与a[i]交换。交换 之后a[0i]就形成了一个有序区。

3.i++并重复第二步直到i==n-1。排序完成。

void Selectsort(int a[], int n)  

{  

    int  minIndex;  

    for (int i = 0; i < n; i++)  //找无序数组最小数的次数

    {  

        minIndex = i; //找最小元素的位置  

        for (int j = i + 1; j < n; j++)  

            if (a[j] < a[minIndex])  

                minIndex = j;  

     if(minIndex!=i){

       //如果不是无序区的最小值位置不是默认的第一个数据,则交换之。

         temp=a[i];

         a[i]=a[minIndex];

         a[minIndex]=temp;

     }

    }  

}

 

插入排序 :可以很清楚的发现,选择排序是固定位置,找元素。相比于插入排序的固定元素找位置,是两种思维方式。

设数组为a[0n-1]

1.      初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=1

2.      a[i]并入当前的有序区a[0i-1]中形成a[0i]的有序区间。

3.      i++并重复第二步直到i==n-1。排序完成。

 

private static void insertSort(int[] arr, int n) {

for (int i = 1; i < n; i++) {   //每次从无序数组中取出一个数

for (int j = i-1; j >= 0; j--) { //把取出的数放到有序数组相应的位置

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

int temp = arr[j+1];

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

arr[j] = temp;

}

}

}

}

 

4:快速排序

对挖坑填数进行总结

1i =L; j = R; 将基准数挖出形成第一个坑a[i]

2j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。

3i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。

4.再重复执行23二步,直到i==j,将基准数填入a[i]中。

static void quick_sort(int s[], int l, int r)

{

    if (l < r)

    {

        int i = l, j = r, x = s[l];

        while (i < j)

        {

            while(i < j && s[j] >= x) // 从右向左找第一个小于x的数

j--;  

            if(i < j) 

s[i++] = s[j];

            while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数

i++;  

            if(i < j) 

s[j--] = s[i];

        }

        s[i] = x;

        quick_sort(s, l, i - 1); // 递归调用 

        quick_sort(s, i + 1, r);

    }

}

0 0
原创粉丝点击