一、冒泡排序(时间复杂度O(n的平方))
原理:如果有n个数,那么外层标记变量从0-n-1,内层变量循环变量从n-1~0,共执行(n-1)+(n-2)+……+2+1=(n-1+1)*(n-1)/2=n*(n-1)/2次,
//从大到小冒泡排序
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// int []data = {9,3,6,21,2,1,34,8,2,3};
int n;
Scanner cin = new Scanner(System.in);
n = cin.nextInt();
int []data = new int[n];
for(int i=0;i<n;i++)
data[i] = cin.nextInt();
for(int i=0;i<data.length-1;i++){
for(int j=0;j<data.length-1-i;j++)
if(data[j]<data[j+1]){
int t = data[j];
data[j] = data[j+1];
data[j+1] = t;
}
}
for(int v:data){
System.out.println(v+" ");
}
}
}
二、快速排序(时间复杂度O(nlogn))具体可以参考https://blog.csdn.net/lzc4869/article/details/80279032这篇博客的内容,快速排序的主要思想是,随机找一个数为基准数用于比较(代码中是找每段的第一个数),小的放在基准数的左边,大的放在基准数的右边,再分治继续比较。
现在有一组数据4、8、6、9、7、1、3、2、5。
一开始以第一个数4作为基准数,先用一个指针从最后一个数往左找第一个比基准数4小的数字,找到了2,再用一个指针从第一个数往右找第一个比基准数4大的数字,找到了8;然后交换8和2的位置,得到:
4、2、6、9、7、1、3、8、5
交换操作完成后,继续移动两个指针,右指针找到了3,左指针找到了6,交换两数位置得:
4、2、3、9、7、1、6、8、5
交换操作完成后,继续移动两个指针,右指针找到了1,左指针找到了9,交换两数位置得:
4、2、3、1、7、9、6、8、5
这时,右指针不能移到左指针的左边因此只能移动1的位置,到左指针移动时,此时,左右指针重合,将基准元素4与指针重合元素1交换位置得:
1、2、3、4、7、9、6、8、5
接着,将数据以基准元素分成1、2、3和7、9、6、8、5左右两部分,分别对左右两部分进行上述的以基准元素排序的操作。以右半部分7、9、6、8、5为例,以7为基准元素,左右两个指针开始操作。
右指针找到5,左指针找到9,交换得:
7、5、6、8、9
操作后,右指针往左移到6的位置,左指针继续往右移动到6的位置,左右指针重合,交换基准元素7和重合位置的6,得
6、5、7、8、9
接着,以基准元素7为基准,将这组数分成左右两部分6、5和8、9,以此类推。
得出结果:1、2、3、4、5、6、7、8、9
import java.util.Scanner;
public class Main {
public static void QS(int []arr,int startIndex,int endIndex){
if(startIndex>=endIndex)
return;
//获取基准元素
int jzIndex = getjz(arr,startIndex,endIndex);
//对基准元素左边进行排序
QS(arr,startIndex,jzIndex-1);
//对基准元素右边进行排序
QS(arr,jzIndex+1,endIndex);
}
public static int getjz(int []arr,int startIndex,int endIndex){
int jz = arr[startIndex];
int left = startIndex;
int right = endIndex;
while(left!=right){
//right指针从右往左找比基准元素小的元素
while((left<right) && arr[right]>jz)
right--;
//left指针从左往右找比基准元素大的元素
while((left<right) && arr[left]<=jz)
left++;
//交换两个指针指向的元素
if(left<right) {
int t = arr[left];
arr[left] = arr[right];
arr[right] = t;
}
}
//left和right重合后,重合点元素和基准元素交换位置
arr[startIndex] = arr[left];
arr[left]=jz;
return left;
}
public static void main(String[] args) {
// int []data = {9,3,6,21,2,1,34,8,2,3};
int n;
Scanner cin = new Scanner(System.in);
n = cin.nextInt();
int []data = new int[n];
for(int i=0;i<n;i++)
data[i] = cin.nextInt();
QS(data,0,data.length-1);
for(int v:data){
System.out.println(v+" ");
}
}
}
三、堆排序(时间复杂度是nlogn)参考博客链接:https://blog.csdn.net/u013384984/article/details/79496052