最近正在找工作,由于是找实习,被问到了很多的基础题,尤其是排序这一块,现在把自己熟悉的两中排序写出来,以供以后复习,
- 冒泡排序
冒泡排序算法运行起来非常慢,但在概念上来说它又是最简单的,因此冒泡排序算法在刚开始研究排序技术时是一个非常好的算法。以下是冒泡排序要遵循的规则:
比较两个数据;
如果前面的数据比后面的数据大,则数据之间进行交换操作;
向后移动一个位置,比较下面两个数据;
但碰到第一个排好顺序的队员后,返回队列最前端重新开始下一趟排序.
public static void bubbleSort(int[] nums){
int temp ; // 记录中间值
int length = nums.length;
for(int i = 0 ; i<length-1; i++){
for(int j = i +1; j<length; j++ ){
if(nums[i]>nums[j]){
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
for(int i = 0 ; i< nums.length; i++){
System.out.print(nums[i]+" ");
}
}
一般来说,数组中有N个数据项,第一趟排序中有N-1次比较,第二趟有N-2次,以此类推。这样算法作了n(n+1)/2次比较。
插入排序
插入排序算法是一个对少量元素进行排序的有效算法。插入排序的工作原理与打牌时整理手中的牌的做法类似,开始摸牌时,我们的左手是空的,接着一次从桌上摸起一张牌,并将它插入到左手的正确位置。为了找到这张牌的正确位置,要将它与手中已有的牌从右到左进行比较,无论什么时候手中的牌都是排序好的。JAVA实现该算法如下:
public static void insertSort(int[] nums){
int length=nums.length; //数组长度
int j; //当前值的位置
int i; //指向j前的位置
int key; //当前要进行插入排序的值
for(i=1;i<length;i++){
key = nums[i];
j = i - 1;
//nums[i]比当前值大时,nums[i]后移一位,空出i的位置,好让下一次循环的值后移
while(j>=0&&key<nums[j]){
//将大于key的往后移动一位
nums[j+1] = nums[j];
j--;
}//跳出循环(找到要插入的中间位置或已遍历到0下标)
nums[j+1] = key;//将当前值插入
}
nums[j]第一次进行右移时覆盖了nums[j+1]值,是否造成了数据丢失?
答:不会造成数据丢失,应为第一次右移前的i-1=j,此时nums[i]的值存在了key里了。每次右移都为下一次右移或插入留出了位置,这就是插入排序的关键点所在。