详细过程就不表了,看代码吧

 import java.util.Arrays;

 public class Sort {

     static int swapTimes=0;
public static void main(String[] args) {
int[] numbers = { 7, 6, 5, 3, 1, 8, 9, 7, 1, 2 ,5};
//*** BubbleSort Test ***
//bubbleSort(numbers); //*** InsertSort Test ***
//insertSort(numbers); //*** MergeSort Test ***
//mergeSort(numbers); //*** HeapSort Test ***
//heapSort(numbers); //*** QuickSort Test *** quickSort(numbers);
System.out.println("result:"+Arrays.toString(numbers)); } /*
* 插入排序
*/
public static void insertSort(int[] numbers) {
System.out.println("InsertSort:"+Arrays.toString(numbers));
if (numbers == null) {
System.out.println("Invalid input!");
return;
}
for (int i = 1; i < numbers.length; i++) {
int temp=numbers[i];
int j=i-1;
for (; j >= 0&&numbers[j]>temp; j--) { //这个数大于比较数,就把这个数右移
numbers[j + 1] = numbers[j];
System.out.println(Arrays.toString(numbers)+"---temp="+temp);
}
numbers[j+1]=temp; //把比较数赋值到正确位置
System.out.println(Arrays.toString(numbers));
}
} /*
* 冒泡排序
*/
public static void bubbleSort(int[] numbers) {
System.out.println("BubbleSort:");
if (numbers == null) {
System.out.println("Invalid input!");
return;
}
for (int i = numbers.length - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (numbers[j] > numbers[j + 1]) {
swap(numbers, j, j + 1);
}
}
}
System.out.println("result:");
}
/*
* 归并排序
*/
public static void mergeSort(int[] numbers){
if(numbers==null){
System.out.println("Invalid input!");
return;
}
mergeSort(numbers,0,numbers.length-1);
} private static void mergeSort(int[] numbers, int start, int end) {
if(start>=end){
return;
}
int mid=(start+end)>>1;
mergeSort(numbers, start, mid);
mergeSort(numbers, mid+1, end);
merge(numbers,start,mid,end);
System.out.println(Arrays.toString(numbers)+"---mid="+mid);
}
/*
* 合并两个有序数组
*/
private static void merge(int[] numbers, int start, int mid, int end) {
int leftLength=mid-start+1;
int rightLength=end-mid;
int[] leftNumbers=new int[leftLength];
int[] rightNumbers=new int[rightLength];
for (int i = 0; i < leftLength; i++) {//将左边的元素赋给left数组
leftNumbers[i]=numbers[start+i];
}
for (int j = 0; j < rightLength; j++) {//同理
rightNumbers[j]=numbers[mid+j+1];
}
int pLeft=0;
int pRight=0;
for(int index=start;index<=end;index++){//开始merge左右数组
if(pLeft==leftLength){ //当left数组合并完了,就直接赋值right数组
numbers[index]=rightNumbers[pRight++];
}else if(pRight==rightLength){
numbers[index]=leftNumbers[pLeft++];
}else{ //左右数组都没赋值完,就要比较大小
if(leftNumbers[pLeft]<=rightNumbers[pRight]){
numbers[index]=leftNumbers[pLeft++];
}else{
numbers[index]=rightNumbers[pRight++];
}
}
}
}
/*
* 堆排序
*/
public static void heapSort(int[] numbers){
if(numbers==null){
System.out.println("Invalid input!");
return;
}
int[] heap=buildHeap(numbers); //构造小顶堆
System.out.println("build Heap:"+Arrays.toString(heap));
int index=0;
while(!isHeapEmpty(heap)){
//注意,这里不能在前面的index++,因为会先算左括号内的++,造成传入的index+1
numbers[index]=popHeapTop(heap,index++); }
}
//将堆顶元素pop出来
private static int popHeapTop(int[] heap,int index) {
int temp=heap[0];
int end=heap.length-1-index;
heap[0]=heap[end]; //将最后一个数移至堆顶
heap[end]=Integer.MAX_VALUE;
adjustHeap(heap, 0); //调整堆
System.out.println("current Heap:"+Arrays.toString(heap));
return temp;
} private static boolean isHeapEmpty(int[] heap) {
if(heap[0]==Integer.MAX_VALUE){
return true;
}
return false;
}
/*
* 构造小顶堆
*/
private static int[] buildHeap(int[] numbers) {
int[] heap=new int[numbers.length];
for(int i=0;i<heap.length;i++){
heap[i]=numbers[i];
}
for(int j=(heap.length>>1)-1;j>=0;j--){ //从有孩子的结点开始,从底向上维护堆
adjustHeap(heap,j);
}
return heap;
}
/*
* 维护堆
*/
private static void adjustHeap(int[] heap, int j) {
int left=j<<1;
int right=(j<<1)+1;
int largest=j;
if(left<heap.length //该左孩子下标必须在数组内
&&heap[left]!=Integer.MAX_VALUE //该元素必须未被覆盖
&&heap[j]<heap[left]){
largest=left;
}
if(right<heap.length
&&heap[right]!=Integer.MAX_VALUE
&&heap[largest]<heap[right]){
largest=right;
} if(largest!=j){
swap(heap, j, largest);
adjustHeap(heap, largest); //继续往下调整
} } /*
* 快速排序
*/
public static void quickSort(int[] numbers){
if(numbers==null){
System.out.println("Invalid input!");
return;
}
System.out.println("QuickSort:");
quickSort(numbers,0,numbers.length-1);
}
private static void quickSort(int[] numbers, int start, int end) {
if(start<end){
int mid=patition(numbers,start,end);
quickSort(numbers, start, mid-1);
quickSort(numbers, mid+1, end);
} }
/*
* 选一个数,将小于它的数放在左边,大于它的放在右边
*/
private static int patition(int[] numbers, int start, int end) {
int small=start-1;
int index=start;
int temp=numbers[end]; //选择数组最后一个元素作为比较数
while(index<=end){
if(numbers[index]<temp){
small++;
if(index!=small){
swap(numbers, small, index);
}
}
index++;
}
swap(numbers, small+1, end);
return small+1;
}
/*
* 交换数组的两个元素
*/
private static void swap(int[] numbers, int a, int b) {
int temp = numbers[a];
numbers[a] = numbers[b];
numbers[b] = temp;
System.out.println("current numbers:" + //记录交换次数
""+Arrays.toString(numbers)+"----swap times:"+(++swapTimes));
} }

【算法与数据结构】冒泡、插入、归并、堆排序、快速排序的Java实现代码的更多相关文章

  1. 快速排序的Java和python实现,亲测实际可用

    1.基本思想 快速排序每趟排序确定一个元素x的位置,使用的方式是 将大于元素x的值放大x的右边,小于元素x的值放大x的左边.当确定x的位置之后,再分别对x左边的数组和右边的数组进行快速排序即可. 2. ...

  2. 快速排序之Java实现

    快速排序之Java实现 代码: package cn.com.zfc.lesson21.sort; /** * * @title QuickSort * @describe 快速排序 * @autho ...

  3. python 数据结构与算法之排序(冒泡,选择,插入)

    目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习 ...

  4. python排序算法实现(冒泡、选择、插入)

    python排序算法实现(冒泡.选择.插入) python 从小到大排序 1.冒泡排序: O(n2) s=[3,4,2,5,1,9] #count = 0 for i in range(len(s)) ...

  5. python算法与数据结构-快速排序算法(36)

    一.快速排序的介绍 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外 ...

  6. 浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树

    http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的 ...

  7. Java实现的各种排序算法(包括冒泡,快排等)

    //堆排序 不稳定 import java.util.Arrays; public class HeapSort { public static void main(String[] args) { ...

  8. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  9. LeetCode_算法及数据结构覆盖统计

    [输入]共计151道题的算法&数据结构基础数据 (见附录A) [输出-算法]其中有算法记录的共计 97道 ,统计后 结果如下  top3(递归,动态规划,回溯) 递归 动态规划 回溯 BFS ...

随机推荐

  1. 快速解析超大XML不占用太大内存

    import xml.etree.ElementTree as ET def parse_res(xml_file): res_dic = {} tmp_lst_lev1 = [] tmp_lst_l ...

  2. js常用正则

    var sTest="xxxkdsj234dogdog1234xx"var reTest1=/(dog){2}/var reTest2 = /(?:dog){2}/;console ...

  3. Integer Break

    Given a positive integer n, break it into the sum of at least two positive integers and maximize the ...

  4. OAuth 2.0 Threat Model and Security Considerations (rfc6819)

    Authorization server The following data elements are stored or accessible on the authorization serve ...

  5. 枚举全排列(包括数列中有重复数)的C语言实现

    据说是用了DFS的思想--然鹅并不知道这是DFS. 主要就是选取一个数放到数组相应位置上,然后递归的排列剩下的数组,将剩下的数组递归排列完了之后再把数放回去,然后这一层递归就返回了-- 有重复数的话遇 ...

  6. C++函数重载和函数模板

    1.函数重载 这是小菜鸟写的一个例子. 函数重载应该注意以下几点: 1.1重载函数有类似的功能: 1.2只能以参数的类型(形参个数和类型)来重载函数, int max(int a,int b);flo ...

  7. 使用yield关键字让自定义集合实现foreach遍历

    一般来说当我们创建自定义集合的时候为了让其能支持foreach遍历,就只能让其实现IEnumerable接口(可能还要实现IEnumerator接口) 但是我们也可以通过使用yield关键字构建的迭代 ...

  8. Calculating Stereo Pairs

    Calculating Stereo Pairs Written by Paul BourkeJuly 1999 Introduction The following discusses comput ...

  9. redirect和forward

    1.重定向 <mvc:view-controller path="/" view-name="redirect:/admin/index"/>即如果 ...

  10. hihoCoder 1309:任务分配 贪心 优先队列

    #1309 : 任务分配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN,  ...