常见排序算法与实现
1.快速排序
快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。(基准数可以是第一个数,可以是中间的数,也可以是最后一个数)
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。(递归)
基准数 分区 递归
(left ,right,array[])
public static void quickSort(int a[], int start, int end) { int i,j; i = start; j = end; if((a==null)||(a.length==0)) return; while(i<j){ while(i<j&&a[i]<=a[j]) //以数组start下标的数据为key,右侧扫描 j--; if(i<j){ //右侧扫描,找出第一个比key小的,交换位置 int temp = a[i]; a[i] = a[j]; a[j] = temp; } while(i<j&&a[i]<a[j]) //左侧扫描(此时a[j]中存储着key值) i++; if(i<j){ //找出第一个比key大的,交换位置 int temp = a[i]; a[i] = a[j]; a[j] = temp; } } if(i-start>1){ //递归调用,把key前面的完成排序 quickSort(a,0,i-1); } if(end-j>1){ quickSort(a,j+1,end); //递归调用,把key后面的完成排序 } }
2.冒泡排序
例子:
/*
冒泡排序基本思想
将n个记录看作按纵向排列,每趟排序时自下至上对每对相邻记录进行比较,若次序不符合要求(逆序)就交换。每趟排序结束时都能使排序范围内关键字最小的记录象一个气泡一样升到表上端的对应位置,整个排序过程共进行n-1趟,依次将关键字最小、次小、第三小…的各个记录“冒到”表的第一个、第二个、第三个… 位置上。
初态 第1趟 第2趟 第3趟 第4趟 第5趟 第6趟 第7趟
38 12 12 12 12 12 12 12
20 38 20 20 20 20 20 20
46 20 38 25 25 25 25 25
38 46 25 38 38 38 38 38
74 38 46 38 38 38 38 38
91 74 38 46 46 46 46 46
12 91 74 74 74 74 74 74
25 25 91 91 91 91 91 91
*/
import java.util.*; public class DemoSort { public static void main(String args[]){ int arr1[]={1,5,3,0,-2,9}; //创建一个Bubble类 Bubble bubble=new Bubble(); bubble.sort(arr1); //输出最后结果(在控制台输出非常消耗cpu) for(int i=0;i<arr1.length;i++) { System.out.print(arr1[i]+" "); } } } //冒泡排序 class Bubble{ //排序方法 public void sort(int arr[]){ int temp=0; //外层循环,决定它走几趟 for(int i=0;i<arr.length-1;i++) { //内层循环,开始逐个比较,如果发现前一个比后一个数大,则交换 for(int j=0;j<arr.length-1-i;j++) //-i是最大的数不参与比较了 { if(arr[j]>arr[j+1]){ //换位 temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } } }