java专业的马上大三,东西学的差不多,但是数据结构这块特别薄弱,所以面试前对自己数据结构进行巩固复习(PS:其实是预习啦~)
针对自己薄弱的几块进行记录:(排序和查找)
每天都在叫嚣自己会什么技术,什么框架,可否意识到你每天都在被这些新名词、新技术所迷惑,.NET、XML等等技术固然诱人,可是如果自己的基础不扎实,就像是在云里雾里行走一样,只能看到眼前,不能看到更远的地方。这些新鲜的技术掩盖了许多底层的原理,要想真正的学习技术还是走下云端,扎扎实实的把基础知识学好,有了这些基础,要掌握那些新技术也就很容易了。
要编写出优秀的代码同样要扎实的基础,如果排序和查找算法学的不好,怎么对程序的性能进行优化?废话不多说,本文要介绍的这些排序算法就是基础中的基础,程序员必知!(引自:http://www.cr173.com/html/15301_1.html)
1、排序
1.插入排序—直接插入排序(Straight Insertion Sort)
2. 插入排序—希尔排序(Shell`s Sort)
3. 选择排序—简单选择排序(Simple Selection Sort)
4. 选择排序—堆排序(Heap Sort)
5. 交换排序—冒泡排序(Bubble Sort)
6. 交换排序—快速排序(Quick Sort)
7. 归并排序(Merge Sort)
8. 桶排序/基数排序(Radix Sort)
对于上面的几种排序,面试的时候最容易问的就是快速排序和冒泡排序,所以就对这两种排序重点说明!
一、快速排序:
先说一下过程:①:选择一个基准的元素,通常选择第一个或者最后一个
②:通过一次排序讲待排序的记录分成两部分,分割的两部分分别是比基准元素大和小的两部分。
③:此时第一个基准元素就在排序好的位置上面了。
④:对排序分成的这两部分按照最初的方法在进行分割排序,直到整个序列有序
快速排序的示例:
(a)一趟排序的过程:
(b)排序的全过程
java代码实现快速排序:
(自己的叙述...)1.首先定义一个数组,数组的第一个数值为Key
2.在这个数组前后各设置一个i和j做标记
3.从 前往后遍历然后让他们与第一个数值key进行比较,当数值小于key的时候与key交换位置,一直遍历到最后一个,j--,
然后如果找到有比key小的数字,i++,
循环遍历直到i=j!
代码:
/**
* description : 快速排序
* @autor kwzhang
* modify :2012-6-20
*
* @param pData
* @param left
* @param right
* @return
*/
static
void
quicksort(
int
n[],
int
left,
int
right) {
int
dp;
if
(left < right) {
dp = partition(n, left, right);
quicksort(n, left, dp -
1
);
quicksort(n, dp +
1
, right);
}
}
static
int
partition(
int
n[],
int
left,
int
right) {
int
pivot = n[left];
while
(left < right) {
while
(left < right && n[right] >= pivot)
right--;
if
(left < right)
n[left++] = n[right];
while
(left < right && n[left] <= pivot)
left++;
if
(left < right)
n[right--] = n[left];
}
n[left] = pivot;
return
left;
}
冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
冒泡排序算法的运作如下:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序的过程图:
代码:
1 public class BubbleSort{
2 public static void main(String[] args){
3 int score[] = {67, 69, 75, 87, 89, 90, 99, 100};
4 for (int i = 0; i < score.length -1; i++){ //最多做n-1趟排序
5 for(int j = 0 ;j < score.length - i - 1; j++){ //对当前无序区间score[0......length-i-1]进行排序(j的范围很关键,这个范围是在逐步缩小的)
6 if(score[j] < score[j + 1]){ //把小的值交换到后面
7 int temp = score[j];
8 score[j] = score[j + 1];
9 score[j + 1] = temp;
10 }
11 }
12 System.out.print("第" + (i + 1) + "次排序结果:");
13 for(int a = 0; a < score.length; a++){
14 System.out.print(score[a] + "\t");
15 }
16 System.out.println("");
17 }
18 System.out.print("最终排序结果:");
19 for(int a = 0; a < score.length; a++){
20 System.out.print(score[a] + "\t");
21 }
22 }
23 }
快速排序适用于数组的数值较大,以及初始化记录无序的情况!
各种排序时间复杂度和空间复杂度总结: