**
简单排序算法
**
1.冒泡排序
数据两两比较,每次冒出一个最大(小)值,需要n+n-1+…+1次比较,时间复杂度o(n^2)
基本代码
void sort(int[] arr){
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])
swap(arr,j,j+1);
}
}
}
void swap(int [] arr,int i,int j){
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
如果给定数组本身已经是排好的顺序,那么优化一下以上排序
如果第一次遍历时没有任何数交换,那么证明已是顺序,直接退出循环即可
void sort(int[] arr){
for (int i = 0 ; i<arr.length-1 ; i++){
Boolean noswap = true;
for (int j =0 ; j<arr.length-1-i ; j++){
if (arr[j]>arr[j+1]){
noswap = false;
swap(arr,j,j+1);
}
}
if(noswap) return;
}
}
冒泡排序引申的鸡尾酒排序
我们从冒泡中得出每次冒出一个最大或最小值,经过n-1次起冒即可得出一条顺序的数组。
但如同鸡尾酒搅拌一样,每次左右搅拌,冒出一个最大值和一个最小值,那么只需n/2次即可冒完,相较于冒泡排序省了很多步。
static void sort(int[] arr){
if (arr == null || arr.length == 1){
return;
}
for (int i = 0;i<arr.length/2;i++){
Boolean noswap = true;
for (int j = 0;j<arr.length-1-i;j++){
if (arr[j]>arr[j+1]){//交换冒出最大值
noswap = false;
swap(arr,j,j+1);
}
}
for (int j = arr.length-2;j>i;j--){
if (arr[j]<arr[j-1]){//交换冒出最小值
noswap = false;
swap(arr,j,j-1);
}
}
if(noswap) return;
}
}
2.插入排序
插入排序:从第二个元素开始,将当前元素插入到前面对应位置,使当前元素和之前元素形成有序数组
static void sort(int[] arr){
int j=0;
for (int i = 1 ; i<arr.length ; i++){
int temp=arr[i];
for (j =i-1 ; j>=0 ; j--){
if (temp<arr[j]){ //找位置
arr[j+1] = arr[j];//数据移动
}else break;
}
arr[j+1] = temp; //插入数据
}
}
3.选择排序
选择排序,从当前数列中找出最小(大)值,把它和首位交换位置,在从剩余数列中找出最小(大)值,放于当前剩余数列首部,然后循环,得出排列好的数列。
static void sort(int[] arr){
if(arr == null || arr.length == 1){
return;
}
for(int i = 0;i<arr.length-1;i++){
int index = i; //index表示最小值的下标
for (int j = i+1;j<arr.length;j++){
if (arr[j]<arr[index]){
index = j;} //找出最小值的下标并赋给index
}
if (arr[i]!=arr[index]) {
swap(arr, index, i);
}
}
}
static void swap(int [] arr,int i,int j){
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
有兴趣的关注我的公众号,一起学习交流啊