冒泡排序:
冒泡排序是一个很简单的排序方式,但效率相对来说不高
排序规则是:两两进行比较,根据大小交换位置,进行多次比较,外层循环n-1次,内层循环n-1-i次
//提供一个数组
int array[] = new int[n];
//临时变量
int temp;
for(int i = 0;i < array.length-1;i++){
for(int j = 0;j<array.length-i-1;j++){
if(array[j]>array[j+1]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
选择排序:
选择排序是一种简单的排序,不稳定排序规则
排序规则是:(升序)认为第一个是最小的数字,每次进行和后一个进行比较,根据大小进行比较
一次循环最后将最小的元素放在第一个,下一次继续未排序的元素
//提供一个数组
int array[] = new int[n];
//临时变量
int temp;
for(int i = 0;i<array.length;i++){
for(int j = i+1;j<array.length;j++){
if(array[i]>array[j]){
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
插入排序:
插入排序是一种简单而稳定的排序方式
排序规则:
第一次:
将下标为0的元素做为-个有序的序列,下标为1的元素就是待排序的元素,用下标为1的元素与下标为0的元素进行比较:如果下标为1的元素小于小标为0的元素,将下标为0的元素的值移动到下标为1的元素上,并记录下标0为插入点,并将下标为1的元素的值赋给下标0元素
第二次:
下标为0和1的元素都是有序的,下标为2的元素为待排序元素使用下标为2的元素与下标为1的元素判断,如果下标2元素的值小于小标1元素的值,将下标1元素的值移动到小标2的位置,并记录下标1为待插入的插入点,然后在使用待排序的元素与下标0的元素比较,如果待排序的元素小于下标0的元素,将下标0的元素移动到下标1元素上,并记录下标0位新的插入点;判断结束将待排序元素插入到最终的插入点的元素上
//提供一个数组
int array[] = new int[n];
//升序排序
for(int i = 0;i,array.length;i++){
//拿到待排序的元素
int temp = array[i];
//待排序的位置
int insertPost = -1;
//对此位置之前的元素进行循环
for(int j = i-1;j>0;j--){
//如果当前元素小于之前的某一个元素x
if(temp<array[j]){
//将x元素替换此元素
array[j+1]=array[j];
//记录x元素的位置
insertPost = j;
}else{
break;
}
if(insertPost!=-1){
//将记录的位置进行元素更新
array[insertPost] = temp;
}
}
}
快速排序:
快速排序:
快速排序之所以称之为快速排序就是因为在实践中,这个算法是最快的排序算法。它的平均运行时间O(NlogN)。最坏的时间复杂度为O(N^2)。
排序规则:任意取一个元素为中心轴,然后从数组首尾两边进行检索,大于中心轴的元素放到尾部–;大于中心轴的元素放在首部++;最后首尾重合时候放入中心轴;最后再对中心轴左边的、右边的数组进行递归排序,一直保持中心轴左边的数据都小于中心轴值,右边的大于中心轴值,左右边进行交替变化。
public static void sort(int a[], int low, int hight) {
int i,j,index;
//判断位置
if(low>hight)
return;
i = low;
j = hight;
//保持L<R
index = a[i]; // 用子表的第一个记录做基准
while(i<j){
//后面的大 不改变
while(i<j&&a[j]>=index)
//R往前移动
j--;
//后面的小 移动
if(i<j)
//移动位置是左指向的位置 添加之后从左+1,再从左边开始
a[i++] = a[j];
//前面的小 不改变
while(i<j&&a[i]<index)
//L往后移动
i++;
if(i<j)
//移动位置是右指向的位置 添加之后从右-1,再从右边开始
a[j--] = a[i];
}
//放回初始元素LR重合位置
a[i] = index;
//继续递归中心轴左边和右边的数组
sort(a,low,i-1);
sort(a,i+1,hight);
}