public class MySort {
public static void main(String[] args) {
int[] arr = { 5, 7, 6, 8,9, 1, 3, 2, 4, 10 };
//selectSort(arr);
//bubbSort1(arr);
//inserSort(arr);
quickSort(arr,0,arr.length-1);
show(arr);
}
public static void show(int [] arr){
for (int i : arr) {
System.out.print(i+"\t");
}
System.out.println("");
}
//冒泡排序:每次要输出的元素都与剩余的元素做比较,以确保每次输出的都是最小值
public static void bubbSort1(int arr[]){
//第一层循环从第一个元素开始,到倒数第二个元素
for(int i=0;i<arr.length-1;i++){
//从当前一个要输出的元素后面的第一个开始到最后一个元素逐个输出
for(int j=i+1;j<arr.length;j++){
//如果当要输出的元素大于后面的元素,则将它们进行交换
if(arr[i]>arr[j]){
int temp=arr[j];
arr[j]=arr[i];
arr[i]=temp;
}
}
}
};
//冒泡排序2:每次把两个相邻的元素作比较,如果第一个元素大于第二个元素,则将他们交换,以确保最后的一个元素为本次循环的最大值。
public static void bubbSort2(int arr[]) {
//每次产生一个最大值,因此要循环数组的.length次
for (int i = 1; i <= arr.length; i++) {
//此时遍历的数组的长度要减去已经排好的元素个数
for (int j = 0; j < arr.length - i; j++) {
if (arr[j] > arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
};
//选择排序:遍历数组的过程中,将最小元素和要输出元素交换,保证当前输出元素为最小元素;
public static void selectSort(int arr[]) {
for (int i = 0; i < arr.length; i++) {
//默认为当前元素的下标为最小元素下标
int min = i;
//输出后面的所有元素
for (int j = i + 1; j < arr.length; j++) {
//和当前最小值做比较,如果小于最小值,则将最小值的下标为当前元素的下标
if (arr[j] < arr[min]) {
min = j;
}
}
//如果最终的最小元素下标不是初始最小元素的下标,则将其交换
if (i != min) {
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
}
//插入排序:默认只含第一个元素的序列是有序的,逐个将后面的元素插入序列中,并保证新的序列有序
public static void inserSort(int arr []){
//从第二个元素开始逐个插入
for(int i=1;i<arr.length;i++){
int j=i-1,temp=arr[i];
//从有序的最后一个元素开始,到第一个元素,如果大于要插入的元素,则将其后移
while(j>=0 && arr[j]>temp){
arr[j+1]=arr[j];
j--;
}
//找到第一个小于插入元素的元素后面插入
arr[j+1]=temp;
}
}
//快速排序,记录无序数组的第一个元素的下标left,以及最后一个元素right;
//默认第一个元素为中间元素,后通过右下标往左移动,左下边往右移动,找到中间位置,插入第一个元素;插入元素左右边若还有元素,则重新采用此原则,继续排序
public static void quickSort(int arr [],int left,int right){
//默认初始化第一个中间数在第一个位置
int mid=arr[left];
//声明两个临时变量记录左右下标的移动
int l=left;
int r=right;
while(l<r){
//从右边开始找,如果大于中间数则继续往左移动,其中l<r为防止左右下标重叠
while(arr[r]>mid && l<r){
r--;
}
if(l<r){ //找到一个小于中间数的元素,将其值赋给左边
arr[l]=arr[r];
}
//从左边开始找,如果小于中间数则继续往右移动,其中l<r为防止左右下标重叠
while(arr[l]<mid && l<r){
l++;
}
if(l<r){//找到一个大于中间数的元素,将其值赋给右边
arr[r]=arr[l];
}
}
//此时,左右两边的下标聚集,即r=l,保存中间元素的位置
arr[r]=mid;
show(arr);
//如果中间数左边还有元素,继续排序
if(left<r-1){
quickSort(arr,left,r-1);
}
//如果中间数右边还有元素,继续排序
if(r+1<right){
quickSort(arr,r+1,right);
}
}
}