Java交换排序:冒泡排序和快速排序
冒泡排序:
冒泡排序(Bubble Sort)是一种典型的交换排序。比较相邻的数值大小,若相邻中两个数值,前一个数值大于后一个数值,则交换他们两个的位置;否则,不交换。以此类推,直到最后一个数字。 (数值小的往前放,数值大的往后放) 就像石头沉入水底一样,小石头质量小,冒泡小;大石头质量大,冒泡大。
举例:有一个原数组,经理一次冒泡排序的过程;原数组为:14,6,3,10,2
第一次比较:14和6比较,14>6,他们两个交换位置;
第二次比较:14和3比较,14>3,他们两个交换位置;
第三次比较:14和10比较,14>10,他们两个交换位置;
第四次比较:14和2比较,14>2,他们两个交换位置;
冒泡练习:随机产生5个1到100的数字,装入数组,然后通过冒泡排序,由小到大排列出来
package com.zzm.sort;
import java.util.Random;
public class Bubble {
public static void main(String[] args) {
bubble();
}
// 冒泡-随机产生5个1到10的数字
public static void bubble() {
int[] arr = new int[5];
for (int i = 0; i < 5; i++) {
arr[i] = new Random().nextInt(100) + 1;// 随机产生5个1到100的数字
}
System.out.println("冒泡排序原来数组:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
System.out.println("-----------------------------------");
for (int i = 0; i < arr.length - 1; i++) {// 排序次数,数字长度为5,因为只用比较4次,所以减1
for (int j = 0; j < arr.length - 1 - i; j++) {// 每次排序大的放后面,因为j+1>数组长度,所以减1;因为每排一轮最大的就放后面了,减i可以增加效率
if (arr[j] >= arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.print("第" + (i + 1) + "次排序结果:");
for (int k = 0; k < arr.length; k++) {
System.out.print(arr[k] + " ");
}
System.out.println();
}
}
}
快速排序:
快速排序:快速排序其实是冒泡排序的一种改进版;在冒泡排序中,比较的是相邻的两个数,进过比较,大数值的往后面方法,小数值的往前面放,每次遍历一次数组,就能找到一个遍历中最大的数,放在最后,经过多次遍历数组,多次找到遍历中最大的数放在后面,最终实现数组由小到大排序。而快速排序,是在要排序的原数组中,找一个数作为标准,与第一个数或者最后一个数作比较,最终实现,这个作为标准的数,它左边的数都比它小,它右边的数狗比它大。这就算是完成一次排序了。再经过递归,就可以实现数组的由小到大的数组排序。
举例:有一个原数组,经理一次快速排序的过程;原数组为:58,62,42,92,35
我选着第一个数58作为标准;大的放后面,小的放前面
第一次比较:58和35比较,58>35,58在前面,35在后面,交换它们的位置
第二次比较:58和62比较,58<62,58在后面,62在前面,交换它们的位置
第三次比较:58和92比较,58<92,58在前面,92在后面,不变换位置
第四次比较:58和42比较,58>42,58在前面,42在后面,交换它们的位置
第一次排序完成后:58左边的数都比58小,58右边的数都比58大;
快排练习:随机产生5个1到100的数字,装入数组,然后通过快速排序排序,由小到大排列出来
package com.zzm.sort;
import java.util.Random;
public class Quicksort {
public static void main(String[] args) {
int[] arr=new int[5];
for(int i=0;i<5;i++){
arr[i]=new Random().nextInt(100)+1;
}
System.out.println("原生快速排序数组为:");
for(int j=0;j<5;j++){
System.out.print(arr[j]+" ");
}
System.out.println();
System.out.println("-------------------");
int start=0;
int end=arr.length-1;
quicksort(arr,start,end);
System.out.println("快速排序后的数组为:");
for(int k=0;k<5;k++){
System.out.print(arr[k]+" ");
}
}
public static void quicksort(int[] arr, int low ,int high) {
int start=low;
int end=high;
int key=arr[low];//不变的
while(end>start){//快排第一遍,找到一个数左边的都比他小,右边的都比他大
while(end>start&&arr[end]>=key){//拿第一个数跟最后一个数比
end--;//第一个数比最后一个数小,就比倒数第二个,,,,以此类推
}
if(arr[end]<=key){//如果第一个数>=最后一个数,就交换位置
int t=arr[end];
arr[end]=arr[start];
arr[start]=t;
}
while(end>start&&arr[start]<=key){
start++;
}
if(arr[start]>=key){
int t=arr[start];
arr[start]=arr[end];
arr[end]=t;
}
}
if(start>low){//标准数,左边的递归
quicksort(arr,low,start-1);
}
if(end<high){//标准数,右边的递归
quicksort(arr,end+1,high);
}
}
}
来源:oschina
链接:https://my.oschina.net/u/4410646/blog/3450963