对数组中元素的三种排序方法
一、冒泡排序
@Test
public void maopao(){
int[] arr={1,2,4,3,7,5,8};
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
二、直接选择排序
@Test
public void xuanZePaiXu(){
int[] arr={20,40,30,10,56};
//当第一个是最小值,当第二个是最小值。。。。
for(int i=0;i<arr.length-1;i++){
//假设第一个是最小值
int minIndex=i;
//拿最小和后面的比,比如第一个就要和第二个比。。依次下去
for(int j=i+1;j<arr.length;j++){
//获取最下值的下标
if(arr[j]<arr[minIndex]){
minIndex=j;
}
}
//如果最小值的小标就是当前最小值的下标那么就不用替换
if(i!=minIndex){
int temp=arr[i];
arr[i]=arr[minIndex];
arr[minIndex]=temp;
}
}
System.out.println(Arrays.toString(arr));
}
三、快速排序
@Test
public void test(){
int[] arr = {5, 2, 6, 12, 1,7,9};
sort(arr,0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
//将[start+1,end]之间的元素分为两拨,左边的所有元素比arr[start]小,右边的所有元素比arr[start]大
public void sort(int[] arr,int start, int end){
if(start < end){
int left = start+1;
int right = end;
while(left<right){
//从左往右,从[start+1]开始找比arr[start]大的数arr[left],让它与arr[right]交换
//当arr[left]大于arr[start]就停止循环,因为此时找到了比arr[start]大的数arr[left]
while(arr[left]<=arr[start] && left<=end){
left++;
}
//从右往左,从[end]开始找比比arr[start]小的数arr[right],让它与arr[left]交换
//当arr[right]小于arr[start]就停止循环,因为此时找到了比arr[start]小的数arr[right]
while(arr[right]>=arr[start] && right>start){
right--;
}
if(left < right){
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
}
//经过上面的while,//如果right>start+1,那么说明在[start+1,end]之间的数分为两拨
//[start+1,right]之间的是比arr[start]小的数
//[right,end]之间的是比arr[start]大的数
//交换arr[start]与arr[right]
if(right > start + 1){
int temp = arr[start];
arr[start] = arr[right];
arr[right] = temp;
}
//此时[start,right-1]之间都是比arr[start]小的数据了,但是它们还未排序
//此时[right+1,end]之间都是比arr[start]大的数据了,但是它们还未排序
//所以需要分别对[start,right-1]、[right+1,end]之间元素重复上面的操作继续排序
sort(arr,start,right-1);
sort(arr,right+1,end);
}
}