public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int[] a = {12, 20, 5, 16, 15, 1, 30, 45, 23, 9};
int start = 0;
int end = a.length - 1;
sort(a, start, end);
for (int i = 0; i < a.length; i++) {
Log.e("arr:", "" + a[i]);
}
}
/**
* 算法规则: 本质来说,快速排序的过程就是不断地将无序元素集递归分割,一直到所有的分区只包含一个元素为止。
* 由于快速排序是一种分治算法,我们可以用分治思想将快排分为三个步骤:
* 1.分:设定一个分割值,并根据它将数据分为两部分
* 2.治:分别在两部分用递归的方式,继续使用快速排序法
* 3.合:对分割的部分排序直到完成
*
* @return
*/
public void sort(int arr[], int star, int end) {
//记录开始的位置
int s = star;
//记录最后的位置
int e = end;
//找到基准数,一般都是第一个
int key = arr[star];
//根据循环判断这个数组,是否大于一个元素。
while (end > star) {
//从右向左找,比他小的数
while (end > star && arr[end] >= key)
end--;
//如果这个数比基准数小,就交换位置
if (arr[end] <= key) {
int tenmp = arr[star];
arr[star] = arr[end];
arr[end] = tenmp;
}
//从左向右找,找到比他大的数
while (end > star && arr[star] < key)
star++;
//然后进行替换
if (arr[star] > key) {
int tenmp = arr[star];
arr[star] = arr[end];
arr[end] = tenmp;
}
}
//判断刚开始的位置改变了没有,如果改变了就是在进行排序
if (s < star) sort(arr, s, star - 1);
//判断结束的位置是否改变,因为是从右向左走的下标肯定是变小
if (e > end) sort(arr, end + 1, e);
}
}
快速排序
最新推荐文章于 2021-11-19 16:57:43 发布