黑马程序员技术交流社区

标题: java中常用的几种排序算法 [打印本页]

作者: 我爱那个我    时间: 2016-10-10 22:22
标题: java中常用的几种排序算法

以下列出Java中常用的几种排序算法,只是简单实现了排序的功能,还有待改进,望指教(以下均假设数组的长度为n):

1)冒泡排序:

依次比较相邻的两个元素,通过一次比较把未排序序列中最大(或最小)的元素放置在未排序序列的末尾。

[java] view plain copy
print?





2)选择排序:

每一次从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

[java] view plain copy
print?




3)插入排序:

将数列分为有序和无序两个部分,每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。

[java] view plain copy
print?


  • public class InsertionSort {  
  •     public static void sort(int data[]) {  
  •         for (int i = 1; i < data.length; i++) {  
  •             for (int j = i; j > 0; j--) {  
  •                 if (data[j] < data[j - 1]) {  
  •                     int temp = data[j];  
  •                     data[j] = data[j - 1];  
  •                     data[j - 1] = temp;  
  •                 }  
  •             }  
  •         }  
  •     }  
  • }  


4)归并排序:

将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。排序过程如下:
(1)申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
(2)设定两个指针,最初位置分别为两个已经排序序列的起始位置
(3)比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
(4)重复步骤3直到某一指针达到序列尾
(5)将另一序列剩下的所有元素直接复制到合并序列尾

[java] view plain copy
print?


  • public class MergeSort {  
  •     public static void sort(int data[], int start, int end) {  
  •         if (start < end) {  
  •             int mid = (start + end) / 2;  
  •             sort(data, start, mid);  
  •             sort(data, mid + 1, end);  
  •             merge(data, start, mid, end);  
  •         }  
  •     }  
  •   
  •     public static void merge(int data[], int start, int mid, int end) {  
  •         int temp[] = new int[end - start + 1];  
  •         int i = start;  
  •         int j = mid + 1;  
  •         int k = 0;  
  •         while (i <= mid && j <= end) {  
  •             if (data < data[j]) {  
  •                 temp[k++] = data[i++];  
  •             } else {  
  •                 temp[k++] = data[j++];  
  •             }  
  •         }  
  •   
  •         while (i <= mid) {  
  •             temp[k++] = data[i++];  
  •         }  
  •         while (j <= end) {  
  •             temp[k++] = data[j++];  
  •         }  
  •   
  •         for (k = 0, i = start; k < temp.length; k++, i++) {  
  •             data = temp[k];  
  •         }  
  •     }  
  •   
  • }  


5)快速排序:

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

[java] view plain copy
print?


  • public class QuickSort {  
  •     public static void sort(int data[], int start, int end) {  
  •         if (end - start <= 0) {  
  •             return;  
  •         }  
  •         int last = start;  
  •         for (int i = start + 1; i <= end; i++) {  
  •             if (data < data[start]) {  
  •                 int temp = data[++last];  
  •                 data[last] = data;  
  •                 data = temp;  
  •             }  
  •         }  
  •         int temp = data[last];  
  •         data[last] = data[start];  
  •         data[start] = temp;  
  •         sort(data, start, last - 1);  
  •         sort(data, last + 1, end);  
  •     }  
  •   
  • }  



作者: Jerry007    时间: 2016-10-10 22:25
兄弟,我完全看不到你的代码或者图片.
还有基础班貌似只需要掌握冒泡排序和选择排序就可以了.
作者: yinyujue    时间: 2016-10-10 22:26
目前只学过冒泡和选择,学习其他了





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2