提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
记录冒泡排序、选择排序、插入排序、快速排序、希尔排序的基本原理学习过程以及代码实现
一、冒泡排序
1.原理
冒泡排序是最基础的一个排序,主要原理是对数据遍历n次,每次遍历都将最大或者最小的元素放置到数组的最前或者最后,取决于按照升序或者降序排列
2.代码实现
代码如下:
int nums [] = new int []{12,3,4,30,1,27,12,8,3};
int len = nums.length;
for(int i = 0; i<len; i++){
for(j=i; j< len; j++){
//降序交换
if(nums[i] > nums[j]){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
System.out.println(Arrays.toString(nums));
二、选择排序
1.原理
本质上是冒泡排序的优化,减少了交换的次数。与冒泡排序一样,遍历n次的数组,每次遍历的时候将当前元素之后的所有元素中最大或者最小的元素找到,与当前的元素进行交换。
2.代码实现
代码如下:
int nums [] = new int []{12,3,4,30,1,27,12,8,3};
int len = nums.length;
for(int i = 0; i<len; i++){
int mKey = i;
for(j=i; j< len; j++){
//找到最小的元素
if(nums[j] < nums[mkey]){
mKey = j;
}
}
int temp = nums[i];
nums[i] = nums[mKey];
nums[mKey] = temp;
}
System.out.println(Arrays.toString(nums));
三、插入排序
1.原理
将数组中的元素插入到一个有序的数组中去,会涉及到元素的移动。
2.代码实现
代码如下:
//在当前数组中直接操作,不再新搞一个数组作为要被插入的有序数组
int nums [] = new int []{12,3,4,30,1,27,12,8,3};
int len = nums.length;
for(int i = 1; i<len; i++){
//当前元素的指针
int curValue= nums[i];
//已排序数组的尾结点指针
int endPoint = i;
while(endPoint >= 0 && nums[endPoint] > curValue){
nums[endPoint+1] = nums[endPoint];
//交换之后尾结点指针前移一位
endPoint--;
}
//循环结束的时候,指针指向的是比当前元素小的位置,所以应该讲当前元素插入到后面的位置
nums[endPoint+1] = curValue;
}
System.out.println(Arrays.toString(nums));
四、快速排序
1.原理
选择一个基准元素,比如选择数组的中间元素,将比基准元素小的移动到左边,比基准元素大的元素移动到右边。重复执行以上操作直到两边没有元素为止
2.代码实现
代码如下:
/**受限选取数组中间的元素作为基准元素,并与末尾元素进行交换。使用两个指针,遍历指针和当前元素指针,
当遍历指针指向的元素比末尾元素小的时候,将当前元素指针向后移动一位,并将元素与遍历指针指向的元素进行交换,
遍历指针往后移动一位,否则只移动遍历指针**/
int nums [] = new int []{12,3,4,30,1,27,12,8,3};
int len = nums.length;
//递归的调用
quickSort(nums,0,len-1);
System.out.println(Arrays.toString(nums));
public void quickSort(int [] num, int start, int end){
if(start == end){
return;
}
//在数组中随机的选择一个元素
int baseIndex = new Random(end-start+1)+start;
//将基准元素与末尾元素进行交换
int temp = num[baseIndex];
num[baseIndex] = num[end];
num[end] = temp;
int curIndex = start-1;
int traverIndex = start;
for(; traverIndex<=end; traverIndex++){
if(num[traverIndex] <= num[end]){
int temp = num[traverIndex];
num[traverIndex] = num[curIndex];
num[curIndex] = temp;
curIndex++;
}
}
if(curIndex > start){
quickSort(num, start, curIndex-1);
}
if(curIndex < end){
quickSort(num, curIndex+1, end);
}
}
五、希尔排序
1.原理
希尔排序可以认为是插入排序的优化,主要思想为将一个数组按照某一个规则进行分组。
例如:按照数组的长度的一半进行分组。{12,3,4,30,1,27,12,8},数组的长度为8。
第一次按照增量为9/2 = 4进行分组,分别是{12,1}、{3,27}、{4,12}、{30,8}。对以上几个分组分别进行插入排序后得到{1,3,4,8,12,27,12,30}
第二次按照增量为4/2 = 2进行分组,分别是{1,4,12,12}、{3,8,27,30}。对以上几个分组分别进行插入排序后得到{1,3,4,8,12,27,12,30}
第三次按照增量为2/2 = 1进行分组,刚好是{1,3,4,8,12,27,12,30}。对以上几个分组分别进行插入排序后得到{1,3,4,8,12,12,27,30}
2.代码实现
int nums [] = new int []{12,3,4,30,1,27,12,8,3};
int len = nums.length;
int gap = len/2;
while(gap >=1){
for(int i = gap; i<len; i++){
//当前元素的指针
int curValue= nums[i];
//已排序数组的尾结点指针
int endPoint = i-gap;
while(endPoint >= 0 && nums[endPoint] > curValue){
nums[endPoint+gap] = nums[endPoint];
//交换之后尾结点指针前移一位
endPoint = endPoint-gap;
}
//循环结束的时候,指针指向的是比当前元素小的位置,所以应该讲当前元素插入到后面的位置
nums[endPoint+gap] = curValue;
}
gap = gap/2;
}
总结
记录学习的过程,本次只记录前五种算法。后续记录归并排序、堆排序、计数排序、桶排序、基数排序