今天整理了一下几种常见的排序:冒泡,选择,插入,和快速排序算法实现。
第一种,冒泡排序:
具体实现:相邻的两个元素比较,后面的元素大于前面的元素,交换位置。
public static int[] maopaoSort(int[] arr){
for(int i=0;i<arr.length-1;i++){
for(int j=1;j<arr.length-i;j++){
if (arr[j-1]>arr[j]){
int temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
}
}
}
return arr;
}
选择排序具体实现:每次把数组中第一个元素作为最小值(这里是最小值),然后在遍历其余数组之后做相互比较,小于最小值的就交换索引下标,最后,再与第一个元素进行交换。以此类推。得到一个排序后的数组
public static int[] selectSort(int[] arr){
for(int i=0;i<arr.length-1;i++){
int min=i;
for(int j=i+1;j<arr.length-i;j++){
if (arr[min]>arr[j]){
min=j;
}
}
int temp=arr[i];
arr[i]=arr[min];
arr[min]=temp;
}
return arr;
}
插入排序具体实现:每个数组可以分为预插入数组(右边),待插入数组(左边第一个元素,后续会增长),每次取出右边元素保存在一个临时变量中,然后和左边数组元素比较,小于则插入左边,大于则插入右边。代码实现
public static int[] insert(int[] arr){
for(int i=1;i<arr.length;i++){
int temp=arr[i];
int j;
for(j=i-1;j>=0;j--){
if (arr[j]>temp){
arr[j+1]=arr[j];
}else{
break;
}
}
arr[j+1]=temp;
}
return arr;
}
其中第二层的for循环可以替换:
int j=i-1;
while (j>=0&&arr[j]>temp){
arr[j+1]=arr[j];
j--;
}
快速排序具体实现:在一个数组中定义两个索引下标i,j分别为最左边的元素和最右边的元素。并选择第一个元素为基数,右边小于基数停止,和左边大于基数则停止,最后交换两者元素。然后又在小的子区间中进行。
public static void quickSort(int[] arr,int low,int high){
int i,j,temp,t;
if(low>high){
return;
}
i=low;
j=high;
//temp就是基准位
temp = arr[low];
while (i<j) {
//先看右边,依次往左递减
while (temp<=arr[j]&&i<j) {
j--;
}
//再看左边,依次往右递增
while (temp>=arr[i]&&i<j) {
i++;
}
//如果满足条件则交换
if (i<j) {
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
//最后将基准为与i和j相等位置的数字交换
arr[low] = arr[i];
arr[i] = temp;
//递归调用左半数组
quickSort(arr, low, j-1);
//递归调用右半数组
quickSort(arr, j+1, high);
}
总结;
花费的时间:快速排序《插入排序《选择排序《冒泡排序