编程的本质就是对数据(信息以数据的形式而存在)的处理,实际编程中不得不处理大量数据,因此实际动手编程之前必须先分析处理这些数据,处理数据之间存在的关系。数据元素之间存在的关联关系被称为数据的逻辑结构。
逻辑结构大致可分为4种:
1、集合:数据元素之间只有“同属一个集合”的关系。
2、线性关系:数据元素之间存在一个对一个的关系。
3、树形结构:数据元素之间存在着一个对多个的关系。
4、图形结构或网状结构:数据元素之间存在着多个对多个的关系。
而同一种逻辑结构,在计算机底层通常有两种物理存储结构:
1、顺序存储结构——一堆数组。
2、非顺序存储结构——链表、散列结构。
算法的设计就取决于以上逻辑结构,算法的实现依赖于数据的存储结构。
排序算法分类:内部排序和外部排序。
内部排序:不需要借助外部存储器,整个排序过程都在内存中完成。
外部排序:数据量非常大,因此计算机无法把数据放在内存中完成排序,需要借助外部存储器如硬盘来完成排序过程,常见的主要是过路归并排序。外部排序可以认为是由多次内部排序完成。
常见的内部排序:
1、选择排序:直接选择排序、堆排序。
2、交换排序:冒泡排序、快速排序。
3、插入排序:直接插入排序、Shell排序、折半插入排序。
4、归并排序
5、桶式排序
6、基数排序
直接选择排序的基本过程:
1、在一组数组元素Array[i~n]中选择一个最小元素i。
2、若它不是这组元素中的第一个元素,则将它与这组元素中的第一个元素对调。
3、找到最小元素,在其余数组元素中重复1、2步直到剩余一个元素。
int[] array = { 12, 65, 18, 9, 0, -5, -33, 100, 22, -40 };
System.out.println("排序前" + "\n" + Arrays.toString(array));
System.out.println("排序后");
for (int i = 0; i < array.length - 1; i++) {
int t = i;// 先假设下表为t的数为最小
for (int j = i; j < array.length; j++) {
if (array[t] > array[j]) {
t = j;
}
}
if (t != i) {
int temp = array[t];
array[t] = array[i];
array[i] = temp;
}
System.out.println(Arrays.toString(array) + "\t" + i + "\t" + t);
}