初级排序

来源:互联网 发布:班尼路质量怎么样 知乎 编辑:程序博客网 时间:2024/05/21 10:18

选择排序(每一趟选出一个最大/最小记录,与序列的首个/最后一个记录交换)

最简单选择排序思路:从头到尾顺序扫描,选出最小的和第一个交换,从接下来的记录重复上述步骤

voidselectSort(int[] R){

intn=R.lenth;

for(inti=0;i<n;i++){

intmin=i;

//a[i]a[i+1...n]中最小元素交换

for(intj=i+1;j<n;j++){

if(R[j]<R[min])   min=j;

inttemp=R[i];R[i]=R[j];R[j]=temp;

}

}

}

对于长度为n的数组,选择排序需要大约n2/2次比较和N次交换。

选择排序运行时间和输入无关,时间复杂度为O(n2);选择排序数据移动最小。

 

通过交换相邻元素进行排序任何算法的平均时间复杂度都为O(n2);

 

插入排序(队伍已经排好,插入到合适的位置)

最差时间复杂度为O(n2),最好时间复杂度为O(n)

直接插入排序思路:每一趟将一个待排序关键字,插入到前序列的相应位置(不断与前面比,一张张移动)

voidinsertSort(int[] nums){

intn=nums.length;

for(inti=1;i<n;i++){

//把待排关键字temp插入到0-j的队伍中

inttemp=nums[i];int j=i-1;

while(j>=0&&temp<a[j]){

nums[j+1]=nums[j];

j--;

}

nums[j+1]=temp;

}

}

 

折半插入排序思路:基于折半查找,找到应该插入的位置

void binaryInsertSortint[] nums{

intn=nums.length;

for(inti=1;i<n;i++){

inttemp=nums[i];

intleft=0,right=i-1;

//折半查找到要插入的位置

while(left<=right){

intmid=left+(right-left)/2;

if(temp<nums[mid])

right=mid-1;

else

left=mid+1;

}

for(intj=i-1;j>=left;j--)

nums[j+1]=nums[j];

nums[left]=temp;

}

}

希尔排序思路:使任意间隔为h的独立元素都是有序的。实现方法是对于每一个h,用插入排序将n个子数独立的排序,相当于只要将插入排序的1改为h即可。

voidshellSort(int[] nums){

intn=nums.length;

 

}

原创粉丝点击