交换排序
来源:互联网 发布:java 线程池call 编辑:程序博客网 时间:2024/05/06 03:37
交换排序:所谓交换,就是根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置
冒泡排序(时间复杂度位o(n^2))小的值往上面浮,比较简单,不过多叙述。
public class Solution1 {
publicstatic void main(String[] args){
intnums[]={1,2,3,6,7,8,9};
inttemp,i,j,low,high,mid,flag=0;
for(i=0;i<nums.length-1;i++){//n个数只用循环n-1次
flag=0;//设置一个标志位,当里面一次都没有交换时,说明已经排好序了
for(j=0;j<nums.length-i-1;j++){//内部交换
if(nums[j]>nums[j+1]){//从小到大排序
temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
flag=1;
}
}
if(flag==0)break;
}
System.out.println(Arrays.toString(nums));
}
}
快速排序
基本思想是基于分治法:在待排序的表中任意选取一个pivot作为基准,通过一趟排序确定基准的位置,将表分为两段,左边的都小于pivot,右段全部大于。再分别到两段中选取pivot进行排序,重复上面的操作。
public class Solution1 {
publicstatic void QuickSort(int nums[],int low,int high){
if(low<high){
intpivotpos=Partition(nums,low,high);//划分
QuickSort(nums,low,pivotpos-1);
QuickSort(nums,pivotpos+1,high);
}
}
publicstatic int Partition(int nums[],int low,int high){
//将第一个元素设置为中枢
intpivot =nums[low];
while(low<high){//设置循环条件
while(low<high&&nums[high]>=pivot)high--;
while(low<high&&nums[low]<=pivot)low++;
if(low<high){
inttemp=nums[low];
nums[low]=nums[high];
nums[high]=temp;
}
}
nums[low]=pivot;//将中枢元素方法最终位置
returnlow;//返回存放pivot的最终位置
}
publicstatic void main(String[] args) {
intnums[]=new int[]{1,3,4,7,2,9};
intlow=0,high=nums.length-1;
QuickSort(nums,low,high);
System.out.println(Arrays.toString(nums));
}
}
题目一:求一个数组中的第k小的元素。第一眼就会想到排序,然后找到数组下标k。但是排序有几种方法:快速、插入等等。这题可以直接用小根堆(后面的文章会介绍的一种排序方式),还可以用快速排序的划分操作。因为每次返回的小标都是排好序的pivot,若相等,则返回,不等,则继续划分。
题目二:一个国旗有红白蓝三色组成,用O(n)的时间复杂度进行排序,利用宏,将三种颜色视为-1,0,1
public class Solution1 {
publicstatic void QuickSort(int nums[]){
intn=nums.length;
inti=0,j=0,k=n-1;//j和k是两个指针,-1,0,1
while(j<=k){
switch(nums[j]){//判断符号
case-1:
inttemp1=nums[i];nums[i]=nums[j];nums[j]=temp1;i++;j++;break;
case0:
j++;break;
case1:
inttemp2=nums[j];nums[j]=nums[k];nums[k]=temp2;k--;break;
}
}
}
publicstatic void main(String[] args) {
intnums[]=new int[]{-1,0,0,1,0,-1,1};
QuickSort(nums);
System.out.println(Arrays.toString(nums));
}
}