面试题之常用排序算法(一)

2014-11-24 09:14:42 · 作者: · 浏览: 0
以下排序默认排序效果是从小到大,待排序序列:3,4,63,4,-9,0,1,32,-2
1.冒泡排序
基本思想:依次交换相邻两个元素,使得大的数据往下沉(或小的数据往上附浮)
第一步:比较相邻的两个元素,如果前者比后者大,则交换两元素。否则,不交换。
第二步:重复第一步直到最后两个元素比较完成,此时,最大的元素已经在最后面了,此趟排序完成。
第三步:去除最后元素,重复上述两步,对最后元素之前的数据进行排序。
第四步:每趟排序完成后,大的数据会忘下沉,也就是需要排序的数据会越来越少,直到没有任何一对数据需要排序,排序成功
代码示例:
[java]
public void bullle(int[] array) {
//双层循环,第一层控制需要排序的趟数
for(int i=0; i
//第二层,对第一个直到array.length-i-1的数据排序
for(int j=0; j
//前者大于后者,交换元素
if(array[j]>array[j+1]) {
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}
2.鸡尾酒排序
基本思想:鸡尾酒排序法相当于双向冒泡排序,在鸡尾酒排序中,在从左向右的方向上,使大的数据往下沉,在回来也就是从右往左的方向上,使小的数据往上浮。
过程示例:
代码示例:
[java]
public void cocktailSort(int[] array) {
int temp;
for(int k=0; k
//使大的数据往下沉
for(int i=k; i
if(array[i]>array[i+1]) {
temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
}
}
//使小的数据往上浮
for(int j=array.length-2-k; j>k; j--) {
if(array[j]
temp = array[j];
array[j] = array[j-1];
array[j-1] = temp;
}
}
}
}
3.快速排序
基本思想:通过一趟排序,使得排序序列分为两部分,一部分的所有数据都小于另一部分,然后在按此方法分别对两部分进行排序,整个排序过程可用递归进行
第一步:选取一个基准值(一般为待排序列的首元素),并记录,使得 i , j 分别指向首元素和最后一个元素
第二步:从右册开始,比较 j 指向元素和基准值的大小,如果大于,j 向前移动一个元素,直到找到一个比基准值小的元素,停止 j 的移动。
此时, 将 j 所指向的元素赋值给 i 所指向的元素,并让 i 向后移动 一 个元素。
第三步:从左侧开始,比较 i 指向元素和基准值的大小,如果小于,i 向后移动一个元素,直到找到一个比基准值大的元素,停止 i 的移动。
此时, 将 i 所指向的元素赋值给 j 所指向的元素,并让 j 向前移动 一 个元素。
第四步:重复上述步骤,知道 i 和 j 指向同一个元素,并将基准值赋值给i 和 j所指向的元素。
此时,序列已经被基准值分为两部分,左侧所有元素小于基准值,右侧所有的元素大于基准值
第五步:使用相同方法,对基准值两侧的序列分别进行排序
排序过程示例:
代码示例:
[java]
private void quickSort(int[] array, int start, int end) {
int i = start, j = end;
int temp = array[start];//记录基准值
while(i
//从右侧开始,找到第一个小于基准值的元素
while(itemp) {
j--;
}
//将j所在位置元素赋值给i所指向的元素,并使i向后移动
if(i
array[i] = array[j];
i++;
}
//从左侧开始,找到第一个大于基准值的元素
while(i
i++;
}
//将i所在位置元素赋值给j所指向的元素,并使j向前移动
if(i
array[j] = array[i];
j--;
}
}
//当i>=j时,循环查找结束,将基准值赋值给i所在位置
array[i] = temp;
//对基准值分割的两部分进行排序
if(i-1>start) {
quickSort(array, start, i-1);
}
if(i+1
quickSort(array, i+1, end);
}
}
4.插入排序
基本思想:排序序列分为两部分,前一部分是已排序的序列,后一部分为待排序序列。
第一步:从待排序序列中选择一个元素,依次比较其和已排序序列中的元素的大小,直到找到一个比它大的元素,并将其插入到这个元素前边
第二步:重复上步,直到待排序序列中没有元素了。
排序过程示例:
代码示例:
[java]
public void InsertSort(int[] array) {
for(int i=1; i
/*
* 第一种方法, 从前往后搜索,直到找到比它大的元素
* 然后将这个元素往后所有已排序序列中的元素向后