排序的四种算法:选择排序,冒泡排序,插入排序,计数排序(前三个都是根据数据之间的大小关系进行排序,而计数排序则是根据数据本身的特性进行比较的与大小无关)
选择排序:思想就是当前元素和之后所有元素进行比较,如果当前大于后者 ,则交换
通俗来讲就是:我们以一组数列为例, 1,3,4,6,7 要用选择排序排列这组数据,先将1依次与后面元素进行比较,如果出现1比哪个元素大,就交换这两个的位置,这样第一轮就可以排列出最小的元素,第二轮开始,3与后面的元素进行比较,排列出第二个元素......一直到最后结束。
其实也就相当于第一轮 角标0 比 角标1~4
第二轮 角标1 比 角标2~4
第三轮 角标2 比 角标3~4
第四轮 角标3 比 角标4
class test01{
public static void main(String[] args){
//1.选择排序
selectSort();
}
public static void selectSort(){
int[] arr={8,5,9,2,7,4,6,1,3};
for(int i=0;i<arr.length-1;i++){//-1是因为没有必要进行最后一个数字的比较
for(int j=i+1;j<arr.length;j++){
if(arr[i] >arr[j]){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
show(arr);
}
public static void show(int[] arr){
String s="";
for(int i=0;i<arr.length;i++){
if(i==arr.length-1){
s+=arr[i];
}else{
s+=arr[i]+",";
}
}
System.out.println(s);
}
}
冒泡排序:思想就是从左到右依次进行比较,出现后者<前者,将两者进行交换
我以下面这组数据为例:1 2 5 4 3
第一轮 1,2相比1<2排列不变,2,5相比2<5排列不变,5,4相比4<5交换位置此时排列成1 2 4 5 3, 5,3和3相比5<3交换位置,此时排列称为1 2 4 3 5,这样第一轮下来就可以将最大数比较出来,置于最后;
第二轮 1,2相比1<2排列不变,2,4相比2<5排列不变,4,3相比4>3交换位置此时排列成1 2 3 4 5 5,这样第一轮下来就可以将第二大数比较出来;就这样一轮一轮的比较,最后剩下角标0与角标1进行比较
一共是比了 length-1轮i的取值就为[0,leng-1),每一轮都是从角标0开始,一直到length-1-i结束
class test01{
public static void main(String[] args){
//2.冒泡排序
bubbleSort();
}
public static void bubbleSort(){
int[] arr={8,5,9,2,7,4,6,1,3};
for(int i=0;i<arr.length-1;i++){//-1是少一轮比较
for(int j=0;j<arr.length-1-i;j++){//-1是为了避免重复和角标越界
if(arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
show(arr);
}
public static void show(int[] arr){
String s="";
for(int i=0;i<arr.length;i++){
if(i==arr.length-1){
s+=arr[i];
}else{
s+=arr[i]+",";
}
}
System.out.println(s);
}
}
插入排序:思想是若当前数字左边有数字且左边数字比它大时,交换两者位置
它与前两个排序不一样的地方就在于,前两个排序都是从角标0开始比较,而插入排序则是从角标1开始比较
每一次的比较j的位置和i一致,若i的左边有数字则j移到i前,比较两个数字的大小
class test01{
public static void main(String[] args){
//3.插入排序
insertSort();
}
public static void insertSort(){
int[] arr={8,5,9,2,7,4};
for(int i=1;i<arr.length;i++){
for(int j=i;j>0&&arr[j-1]>arr[j];j--){
int temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
}
}
show(arr);
}
public static void show(int[] arr){
String s="";
for(int i=0;i<arr.length;i++){
if(i==arr.length-1){
s+=arr[i];
}else{
s+=arr[i]+",";
}
}
System.out.println(s);
}
}
计数排序:思想是将数字和角标进行规整----拿到数字找角标,对应角标++即可
是一个牺牲空间换时间的排序
步骤是:1.先获取最大值和最小值
2.根据最大值和最小值 计算存储数据的大小 max-min+1
3.计算偏移量 offset 角标=角标对应的数据-offset
class test01{
public static void main(String[] args){
//4.计数排序
countSort();
}
public static void countSort(){
int[] arr={8,5,9,2,7,4,6,1,3,10,-3,-2,-10};
int min=arr[0];
int max=arr[0];
for(int i=0;i<arr.length;i++){
if(arr[i]>max){
max=arr[i];
}
if(arr[i]<min){
min=arr[i];
}
}
int[] nums=new int[max-min+1];
int offset=min;
for(int i=0;i<arr.length;i++){
nums[arr[i]-offset]++;
}
for(int i=0;i<nums.length;i++){
if(nums[i]!=0){
for(int j=0;j<nums[i];j++){
System.out.print(i+offset+" ");
}
}
}
}
public static void show(int[] arr){
String s="";
for(int i=0;i<arr.length;i++){
if(i==arr.length-1){
s+=arr[i];
}else{
s+=arr[i]+",";
}
}
System.out.println(s);
}
}