冒泡排序
冒泡排序的原理十分简单:用数组的第一个元素和第二个元素进行比较,将大的放到后面,这个过程称为一次,。然后用第二个和第三个比较,大的放后面,以此类推,直到最后一个元素,这个过程称为一趟。在一趟结束后,最大的元素已经放在最后一位了,然后开始第二趟,第二趟结束后第二大的元素就被放到倒数第二个位置,就这样持续直到所有元素有序为止。那么下面使用代码实现:
int arr[] = {
1,54,7,91,63,2,4,7};
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length-i-1; j++) {
if(arr[j]>arr[j+1]){
arr[j] = arr[j+1]^arr[j];
arr[j+1] = arr[j+1]^arr[j];
arr[j] = arr[j+1]^arr[j];
}
}
}
System.out.println(Arrays.toString(arr));
输出:
选择排序
选择排序的原理和冒泡排序差不多,不过冒泡排序是相邻两个元素比较,以此类推,而选择排序则是使用第一个元素和后面的其他元素挨个比较,将大的放到后面,然后使用第二个元素与后面的元素比较,大的放后面,以此类推最终达到有序。
int arr[] = {
1,54,7,91,63,2,4,7};
for (int i = 0; i < arr.length; i++) {
for (int j = i+1; j < arr.length; j++) {
if(arr[i]>arr[j]){
arr[i] = arr[j]^arr[i];
arr[j] = arr[j]^arr[i];
arr[i] = arr[j]^arr[i];
}
}
}
System.out.println(Arrays.toString(arr));
结果:
插入排序
插入排序的原理会比较麻烦,他是将第一个元素作为起始数组,不管这个元素是大还是小。然后用第二个元素与这个元素进行比较,如果比起始元素大,则放在起始元素之后,反之放在之前,组成一个有序集合,然后用其他元素跟有序集合中的元素比较,插入到正确的位置,以此类推达到有序。
int arr[] = {
1,54,7,91,63,2,4,7};
for (int i = 0; i < arr.length; i++) {
int b = arr[i];
int c = i;
while(c>0&& b<arr[c-i]){
arr[c] = arr[--c];
}
if(c!=i){
arr[c] =b;
}
}
结果:
二分查找
二分查找是一个具有前提的算法,前提就是必须这个数组是有序的,如果你是无序的要么你使用别的算法或者你排好序了再用
既然是二分查找首先我们先确定中间值,因为一半儿一半儿嘛(要不然咋叫二分查找), 中间值 = (开始元素的下标 + 结束元素的下标)/2
这时候把你输入的元素和这个中间值比较,如果大那就在右半部分,反之亦然
System.out.println("请输入数字");
int arr[] = {
1,5,6,9,11,17,19,22,29,44,55,77,88,155,999};
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int start = 0;
int end = arr.length-1;
while (true) {
int m = (start+end)/2;
if(arr[m]>a){
end = m-1;
}else if(arr[m]<a){
start = m+1;
}else {
System.out.println("找到了"+","+m+"位");
break;
}
if(start>end){
System.out.println("没有这个数");
break;
}
}
结果
部分排序法:使用Array.sort还可进行选择想要排序的部分数字,如将下角标编号为1~4的数字进行排序,其他数字顺序不变
public static void main(String[] args) {
int[] arr = {4,3,5,1,2,9,3,0};
Arrays.sort(arr,1,4);
for (int i = 0;i<arr.length;i++){
System.out.print(arr[i]+",");
}
}
快速排序
快速排序是这四种排序中最复杂的,但在处理大量数据的排序时,快速排序却是效率最高的,他的原理很简单:先从一堆数据中挑选出一个基准数,然后将比这个基准数小的数据全部放在基准数的前面,将比他大的放在基准数后面,此时,不管前后,都是无序的,然后再分别在前后两组数据中挑出一个基准数,重复此操作,一直分下去,分成两部分、四部分、八部分。。。直到每一个数据的左边都比他小,右边都比他大,此时整个数组就是有序的了。
public static void QuickSort(int[] arr, int start,int end ){
if(start<end){
int index=getIndex(arr,start,end);//定义getIndex方法传入参数
QuickSort(arr,start,index-1);//使用递归的方法,对基准数左边部分进行递归
QuickSort(arr, index+1, end);//对右边部分递归
}
}
private static int getIndex(int[] arr, int start, int end) {
int i=start;
int j=end;
//定义一个基准数
int x=arr[i];
while (i<j){
//从后往前找比他小的数的下标。
while (i < j&&arr[j]>x) {
j--; //如果比他大则向前移动,直到找到小的为止。
}
//将找到的数填到上一个数的位置。
if (i < j) {
arr[i] = arr[j];
i++;
}
//从前往后找比他大于等于的数的下标。
while (i < j && arr[i]<= x) {
i++;
}
if (i < j) {
arr[j] = arr[i];
j--;
}
}
arr[i]=x;
return i;
}
希尔排序
希尔排序的思想:
首先它把较大的数据集合分割成若干个小组(逻辑上分组),然后对每一个小组分别进行插入排序。
//将整个数组分为若干个子数组
//遍历各组的元素
//交换元素
int a[] = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
for (int gap = a.length / 2; gap > 0; gap = gap / 2) {
for (int i = gap; i < a.length; i++) {
for (int j = i - gap; j >= 0; j = j - gap) {
if (a[j] > a[j + gap]) {
int temp = a[j];
a[j] = a[j + gap];
a[j + gap] = temp;
}
}
}
}