快排和冒泡
手写快排和冒泡
快速排序
- 第一种写法
public static int[] qsort1(int arr[], int start, int end) {
int i = start;//定义起点
int j = end;//定义终点
int key = arr[start];//一开始先选择第一个数为要比较的值
while (i < j) {//i,j相遇才退出循环
while ((i < j) && arr[j] > key) {//从右往左遍历,直到找到一个比key小或等于key的值
j--;
}
while ((i < j) && arr[i] < key) {//从左往右遍历,直到找到一个比key大或等于key的值,第一个值一般会与最先找到的j处的值交换(除非j处的值与key相等)
i++;
}
if ((arr[i] == arr[j]) && (i < j)) {//如果i,j处的值与key相等,就不用交换
i++;//遇此情况,i自增
} else {//如果不相等,或者i,j相遇,交换两个i,j两个索引处的值
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
//递归调用
if (i - 1 > start) arr = qsort1(arr, 0, i - 1);
if (j + 1 < end) arr = qsort1(arr, j + 1, end);
return arr;
}
- 第二种写法
public static int[] qsort2(int arr[], int start, int end) {
int i = start;
int j = end;
int key = arr[i];
while (i < j) {
while ((i < j) && arr[j] > key) {
j--;
}
if (i < j) {
arr[i] = arr[j];
i++;
}
while ((i < j) && arr[i] < key) {
i++;
}
if (i < j) {
arr[j] = arr[i];
j--;
}
}
arr[i] = key;
if (i - 1 > start) arr = qsort2(arr, 0, i - 1);
if (j + 1 < end) arr = qsort2(arr, j + 1, end);
return arr;
}
冒泡排序
public static int[] bolbsort(int arr[], int start, int end) {
int i = start;
int j = end;
while (i < j) {
if (arr[i] > arr[i + 1]) {
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
i++;
} else {
i++;
}
}
if (j - 1 > start) arr = bolbsort(arr, start, j - 1);
return arr;
}
//自己优化的版本,做一个判断,如果一次遍历中没有做交换,即已经排好序了,就不用再冒泡了
public static int[] bolbsort(int arr[], int start, int end) {
int i = start;
int j = end;
Boolean b=false;
while (i < j) {
if (arr[i] > arr[i + 1]) {
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
i++;
b=true;
} else {
i++;
}
}
if (b){
if (j - 1 > start) arr = bolbsort(arr, start, j - 1);
}
return arr;
}

浙公网安备 33010602011771号