Java实现简单的排序

来源:互联网 发布:专业手机录音软件 编辑:程序博客网 时间:2024/06/05 18:10

一、冒泡排序(Bubble Sort)

   冒泡排序是排序中比较简单的一种,基本的思想就是比较数组中相邻两个数的大小。如果前面一个比后面一个数值大就交换位置。

   循环一遍数组,比较每一对相邻的数。让大的不断沉下去,让数值小的不断冒上来,这样就有点类似于冒泡这个思想。(下文中的a都是代表要排序的数组)

               <span style="font-size:18px;">//数组中交换用的中间变量int temp=0;//循环遍历数组for(int i=0;i<a.length;i++){//for(int j=0;j<a.length-i-1;j++){if(a[j]>a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}</span>


二、选择排序(ChoseSort)

  选择排序和冒泡排序特别像,不同的一点是选择排序每次都在未排好序的序列里面选出最小的,最后排成一个升序的数组。

        int temp=0;                for(int i=0;i<a.length;i++){                    //每次都在剩下的没排好序的序列里面选择出最小的一个            for(int j=i+1;j<a.length;j++){                if(a[i]>a[j]){                    temp=a[i];                    a[i]=a[j];                    a[j]=temp;                }            }        }

三、插入排序(InsertSort)

  插入排序的基本思想就是将一个未排序的序列中的数插入一个已经排好序的子数组中。依次循环,直到到达数组末,把整个数组排好序。

  我们可以先把数组的第一个和第二个数进行一下比较,排好序,再以其作为一个有序数组,把后面没排序的数依次插入有序数组中。直到整个数组排好序,也就是for到数组末的时候。

                //交换数组值的中间变量int temp=0;for(int i=1;i<a.length;i++){int j=i-1;temp=a[i];while(j>=0&&a[j]>temp){//把数组整体后移一位a[j+1]=a[j];j--;}//将要插入的数放到整个后移了的数组的前面因为上面做了j--,现在的下标应该是要插入的位置a[j+1]=temp;}

四、快速排序

   快速排序的基本思想就是,先找一个数作为基数,然后将数组中其他的数与之进行比较,小的放在这个数的前面,大的放到这个数的后面。再将这个数的前面和后面的数当成单独的数组,

  再进行同样的操作,迭代到最后只剩一个数的时候。

/**  * 排序的方法  * @param s要排序的数组  * @param l第一个位置  * @param r数组的最后一个位置  */public  int[] sort(int[] a,int l,int r){if(l<r){int i=l,j=r,x=a[i];while(i<j){//先从右到左找第一个小于x的数while(i<j&&a[j]>=x){j--;}//如果找到了就跳出循环,并把值放入a[i]这个坑a[i++]=a[j];//从左到又寻找第一个大于x的数while(i<j&&a[i]<=x){i++;}//如果找到就跳出循环,并将其值放入a[j]这个坑a[j--]=a[i];}//将最初的基数放入a[i]这个坑a[i]=x;//递归调用sort(a, l, i-1);sort(a, i+1, r);}return a;}


五、希尔排序(ShellSort)

希尔排序有点类似于插入排序,在排序前,我们首先要获得一个步长(当前位置往后走的步数),一般是数组的长度除以2;把当前的这个数与数组在当前位置呢往后面走n个步长的值进行一个插入排序。

int i,j,gap,n=a.length;//步长,就是当前位置往后走的步数for(gap=n/2;gap>0;gap/=2){//直接插入排序for(i=0;i<gap;i++){for(j=i+gap;j<n;j+=gap){//直接插入排序if(a[j]<a[j-gap]){//把当前j位置的值放到temp里面保存起来int temp=a[j];//j往前面走步长gapint k=j-gap;//如果有a[k]>temp的话,把排好序的整个后移gap//把要插入的值放到当前的位置,就是插入排序while(k>=0&&a[k]>temp){a[k+gap]=a[k];k-=gap;}a[k+gap]=temp;}}}}

希尔排序的优化的写法

/** * 从第一个步长数据开始,依次对每个元素与自己组内的数据进行直接插入排序 * 对上面的优化 * @param a */public void sort2(int[] a){int j,gap,n=a.length;for(gap=n/2;gap>0;gap/=2){for(j=gap;j<n;j++){if(a[j]<a[j-gap]){//把当前j位置的值放到temp里面保存起来int temp=a[j];//j往前面走步长gapint k=j-gap;//如果有a[k]>temp的话,把排好序的整个后移gap//把要插入的值放到当前的位置,就是插入排序while(k>=0&&a[k]>temp){a[k+gap]=a[k];k-=gap;}a[k+gap]=temp;}}}}

六、归并排序(MergeSort

     归并排序是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并

归并排序算法稳定,数组需要O(n)的额外空间,链表需要O(log(n))的额外空间,时间复杂度为O(nlog(n)),算法不是自适应的,不需要对数据的随机读取。


public static void main(String[] args) {        int[] a = { 57, 68, 59, 52, 72, 28, 96, 33 };        sort(a, 0, a.length-1);}    public static void sort(int[] a, int left, int right) {        if (left >= right)            return;        int center = (left + right) >> 1;        sort(a, left, center);        sort(a, center + 1, right);        merge(a, left, center, right);}    public static void merge(int[] data, int left, int center, int right) {        int[] tmpArr = new int[right+1];        int mid = center + 1;        int index = left; // index记录临时数组的索引        int tmp = left;        // 从两个数组中取出最小的放入中临时数组        while (left <= center && mid <= right) {            tmpArr[index++] = (data[left] <= data[mid]) ? data[left++]: data[mid++];        }        // 剩余部分依次放入临时数组        while (mid <= right) {            tmpArr[index++] = data[mid++];        }        while (left <= center) {            tmpArr[index++] = data[left++];        }        // 将临时数组中的内容复制回原数组        for (int i = tmp; i <= right; i++) {            data[i] = tmpArr[i];        }        System.out.println(Arrays.toString(data));}


0 0
原创粉丝点击