简单排序算法
Posted gitzzp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单排序算法相关的知识,希望对你有一定的参考价值。
冒泡排序
两个for循环,两两进行比较,如果满足规则,则将两个数据进行交换
public int[] maopao()
int[] arrays = 1, 3, 9, 5, 11, 66, 85, 97, 101, 588, 469, 258, 147, 369, 456;
for (int i = arrays.length - 1; i > 0; i--)
for (int j = 0; j < i; j++)
if (arrays[j] > arrays[j + 1])
int temp = arrays[j];
arrays[j] = arrays[j + 1];
arrays[j + 1] = temp;
return arrays;
优化1
public int[] maopao1()
int[] arrays = 1, 3, 9, 5, 11, 66, 85, 97, 101, 588, 469, 258, 147, 369, 456;
for (int i = arrays.length - 1; i > 0; i--)
//是否发生了交换
boolean isExchanged = false;
for (int j = 0; j < i; j++)
if (arrays[j] > arrays[j + 1])
int temp = arrays[j];
arrays[j] = arrays[j + 1];
arrays[j + 1] = temp;
//发生了交换
isExchanged = true;
//如果没有发生交换 表示已经是有序状态 没有必要继续遍历了
if (!isExchanged)
break;
return arrays;
优化二
public int[] maopao2()
int[] arrays = 1, 3, 56, 32, 33, 5, 6, 60, 61, 62, 63, 64;
for (int i = arrays.length - 1; i > 0; i--)
//记录最后一次发生交换的坐标位置,该坐标之后的数据没有发生交换,代表是有序状态
int changeIndex = 0;
for (int j = 0; j < i; j++)
if (arrays[j] > arrays[j + 1])
int temp = arrays[j];
arrays[j] = arrays[j + 1];
arrays[j + 1] = temp;
//最后一次发生交换的坐标
changeIndex = j + 1;
//下次可以从发生交换坐标的位置开始循环
i = changeIndex;
return arrays;
选择排序
不断的从数组中找出最大值,然后放入末尾
public int[] xuanze()
int[] arrays = 1, 3, 9, 5, 11, 66, 85, 97, 101, 588, 469, 258, 147, 369, 456;
for (int i = arrays.length - 1; i > 0; i--)
//记录下标
int maxIndex = 0;
for (int j = 0; j < i; j++)
if (arrays[maxIndex] < arrays[j + 1])
//记录较大值的下标,循环进行比对,找到最大值下标
maxIndex = j + 1;
//将最大值与队尾进行交换 然后进行下一次遍历
int temp = arrays[maxIndex];
arrays[maxIndex] = arrays[i];
arrays[i] = temp;
return arrays;
插入排序
从数组中获取数字,并和已有的数据进行对比,选择自己插入的位置
public int[] charu()
int[] arrays = 1, 3, 9, 5, 11, 66, 85, 97, 101, 588, 469, 258, 147, 369, 456;
int current = 0;
for (int i = 1; i < arrays.length - 1; i++)
//取出比较项
current = arrays[i];
//记录比较项前一项的下标
int pre = i -1;
//当前比较项数据小于前一项数据
while (pre >= 0 && current < arrays[pre])
//将前一项数据赋值给当前数据
arrays[pre + 1] = arrays[pre];
//下标前移 将比较项与更前边的数据进行比较
pre--;
//当移到最前边 或者是比较项数据大于前一项数据的时候 将比较项赋值给前一项数据后边的位置
arrays[pre + 1] =current;
return arrays;
希尔排序
将序列分成一个矩阵,分为m列,逐列进行排序,m从某个整数逐渐减为1,当m为1的时候,整个序列将完全有序
希尔排序是插入排序的改进版本,是一个非稳定排序。
快速排序
快速排序的本质就是把基准数大的都放在基准数的右边,把比基准数小的放在基准数的左边,这样就找到了该数据在数组中的正确位置.
再采用递归的方式分别对前半部分和后半部分排序,当前半部分和后半部分均有序时该数组就自然有序了。
void Quick_Sort(int *arr, int begin, int end)
if(begin > end)
return;
int tmp = arr[begin];
int i = begin;
int j = end;
while(i != j)
while(arr[j] >= tmp && j > i)
j--;
while(arr[i] <= tmp && j > i)
i++;
if(j > i)
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
arr[begin] = arr[i];
arr[i] = tmp;
Quick_Sort(arr, begin, i-1);
Quick_Sort(arr, i+1, end);
二分法查找
二分法查找的思路如下:
(1)首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。
(2)如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。
(3)如果某一步数组为空,则表示找不到目标元素。
public int binarySearch(int[] arr, int key)
int left = 0; //数组最小索引值
int right = arr.length - 1; //数组最大索引值
while (left < right)
int mid = (left + right) / 2;//获得中间值,将数组一分为二
if (key == arr[mid])
return mid + 1;
else if (key > arr[mid]) //key大于中间值,因此在右侧的二分之一数组中再次寻找
left = mid + 1;
else //同理
right = mid - 1;
return -1;//没有找到
以上是关于简单排序算法的主要内容,如果未能解决你的问题,请参考以下文章