第四天学习
常见数据结构
数据结构可视化网站:点击
- 栈:栈可以把它想成是一个桶结构,只能从加入数据只能加到顶端,取数据时也只能从上面开始取,简单的说就是先进后出
- 队列:可以把队列想成是一根两边都通的管道,但是队列的入口和出口完全固定,只能由一边进,从另一边出,简单的说就是先进先出
- 链表:可以在链表的任意位置插入数据,也可以从任意位置取出,但是都要从头开始遍历列表,不能从中间位置开始遍历
- 哈希表:哈希表有点类似于字典,与字典不同的是哈希表一个哈希值可以对应很多个映射值,具体解释参考:链接
快速排序
使用递归可方便的实现快速排序、下面是快速排序的原理
下面我们通过一个案例来演示一下快速排序的基本步骤: 以序列 46 30 82 90 56 17 95 15 共8个元素
初始状态: 46 30 82 90 56 17 95 15 选择46 作为基准值,i = 0, j = 7
i = 0 j = 7
15 30 82 90 56 17 95 46 15 < 46, 交换 15 和 46,移动 i, i = 1
i = 1 j = 7
15 30 82 90 56 17 95 46 30 < 46, 不需要交换,移动 i , i = 2
i = 2 j = 7
15 30 46 90 56 17 95 82 82 > 46, 交换82 和 46,移动 j , j = 6
i = 2 j = 6
15 30 46 90 56 17 95 82 95 > 46, 不需要交换,移动 j , j = 5
i = 2 j = 5
15 30 17 90 56 46 95 82 17 < 46, 交换46 和 17,移动 i, i = 3
i = 3 j = 5
15 30 17 46 56 90 95 82 90 > 46, 交换90 和 46,移动 j , j = 4
3 = i j = 4
15 30 17 46 56 90 95 82 56 > 46, 不需要交换,移动 j , j = 3
i = j = 3
i = j = 3, 这样序列就这样分割成了两部分,左边部分{15, 30, 17} 均小于 基准值(46);右边部分 {56, 90,95,82},均大于基准值。这样子我们就达到了分割序列的目标。在接着对子序列用同样的办法进行分割,直至子序列不超过一个元素,那么排序结束,整个序列处于有序状态。
根据以上原理,使用java实现快速排序
class QuickSort{
public static void main(String[] args){
int[] a = {9,8,6,54,3,1,8,10,2,9,50,4,5,3,79,90,56,65};
int low = 0;int high = a.length-1;
_quickSort(a,low,high);
System.out.println(Arrays.toString(a));
}
public static int getMiddle(int[] list, int low, int high){
int tmp = list[low];//设置基准值为数组的第一个值
int change;//设置交换变量
while (low<high)
{
while (low<high && list[high]>=tmp) // 最开始从右边开始右边移动
{
high--; // 正常情况下右边的数据比基准数大,不用交换数据,右边继续开始向左移动
}
change = list[low]; // 如果基准数大于有边的数据,交换两个数,此时基数已经换到右边,下一步从左边开始移动
list[low] = list[high];
list[high] = change;
while (low<high && list[low]<=tmp) //左边移动
{
low++; // 正常情况下左边数字比基数要小,继续移动
}
change = list[low];
list[low] = list[high];
list[high] = change;
}
return low; //当low和high相等时,一次排序结束,此时在low和high上面的就是基数,并且左边的数字小于基数,右边的数字大于基数
}
public static void _quickSort(int[] list,int low, int high){
/*
此函数实现递归,直到数组被分解到单个数字时,才会跳出函数,此时排序已经完成
*/
if(low<high){
int middle = getMiddle(list,low,high);
_quickSort(list,low,middle-1);
_quickSort(list,middle+1,high);
}
}