static public void FastSort(int[] array,int left,int right){
// 快速排序:
if(left>right){
return;
}
// 先定义左右双指针,中间指针,设立基准值
int start=left;
int end=right;
int temp=array[start];
int p;
// 左右双指针移动
while(start<end) {
// end指针先向右移动,直到找到比temp数据小的数据才停下来
while (array[end] >= temp && start < end) {
end--;
}
// 如果左边数据大于基准
while (temp>=array[start] && start < end) {
start++;
}
// 当两个指针找到了停止的指针,两者交换,程序继续
if (start < end) {
p = array[end];
array[end] = array[start];
array[start] = p;
}
}
// 到达中心处,必须使基准数据与中心的数据交换位置
array[left]=array[start];//这一步是传递参数给left,此处表示left(0)位置的数据变成了中心数据,left在0位
array[start]=temp;
//递归调用左半数组,[left,end-1]
FastSort(array, left, end-1);
//递归调用右半数组,[end+1,right]
FastSort(array, end+1, right);
}
// 折半查找-查找第一个数据
public static int getFirst(int[] nums,int target) {
int left = 0;//左头指针
int right = nums.length-1;//右尾指针
//1.设定中间指针,逻辑是找寻第一个下标
//2.如果target比nums[mid]大,说明在mid的右边,移动左指针
//3.反之亦然
while(left<=right) {
int mid = left + (right-left)/2;
if (target>nums[mid]) {
left=mid+1;
}else{
right=mid-1;
};
if(left==right){
break;
}
}
if(nums[left]==target){
return left;
}
return -1;
}
public static int getLast(int[] nums,int target) {
int left = 0;//左头指针
int right = nums.length-1;//右尾指针
int mid = 0;
while(left<right){
// 只要提前一位数据,中间值就会退一个数据
mid=(left+right+1)/2;
if(target >=nums[mid]){
left=mid;
}else{
right=mid-1;
}if(left==right){
break;
}
}
if(nums[right]==target){return right;}
return -1;
}
main实现:
public static void main(String[] args) {
int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
FastSort(arr,0,arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println(" ");
int[] arr2={1,3,23,45,77,77,77,77,77222,456,876,990};
System.out.println(getFirst(arr2,77));
System.out.println(getLast(arr2,77));
}