常见排序算法

---------------------------稳定的

--------------------------------------------------------------冒泡算法

 1 /**
 2  * 冒泡排序算法的运作如下: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
 3  * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 
 4  * 针对所有的元素重复以上的步骤,除了最后一个。
 5  * 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
 6  * @param arr int[] 需要排序的数组
 7  * @return arr排序完成的数据
 8  */
 9 public int[] sort(int[] arr) {
10     int temp = 0;
11     for (int i = arr.length - 1; i > 0; --i) {
12         for (int j = 0; j < i; ++j) {//从开始第一对到结尾的最后一对
13             if (arr[j] > arr[j + 1]) {
14                 temp = arr[j];
15                 arr[j] = arr[j + 1];
16                 arr[j + 1] = temp;
17             }
18         }
19     }
20     return arr;
21 }

-------------------------------------------------------------------直接插入排序

 1 /**
 2  * 直接插入排序
 3  * (1)设置监视哨r[0],将待插入纪录的值赋值给r[0]; 
 4  * (2)设置开始查找的位置j; 
 5  * (3)在数组中进行搜索,搜索中将第j个纪录后移,直至r[0].key≥r[j].key为止; 
 6  * (4)将r[0]插入r[j+1]的位置上。
 7  * @param arr 需要排序的数组
 8  * @return 排序完成的数组
 9  */
10 public int[] sort(int[] arr) {
11     for (int i = 1; i < arr.length; i++) {
12         int temp = arr[i];
13         int j = i-1;
14         for (; j >= 0; j--) {
15             if(temp<arr[j]) {
16                 arr[j+1] = arr[j];
17             } else {
18                 break;
19             }
20         }
21         arr[j+1] = temp;
22     }
23     return arr;
24 }

-----------------------------------------------------------------------二分插入排序(折半插入排序)

 1 /**
 2  * 折半排序算法 
 3  * 在将一个新元素插入已排好序的数组的过程中,寻找插入点时, 将待插入区域的首元素设置为a[low],末元素设置为a[high],
 4  * 则轮比较时将待插入元素与a[m],其中m=(low+high)/2相比较,
 5  * 如果比参考元素小,则选择a[low]到a[m-1]为新的插入区域(即high
 6  * =m-1),否则选择a[m+1]到a[high]为新的插入区域(即low=m+1),
 7  * 如此直至low<=high不成立,即将此位置之后所有元素后移一位 ,并将新元素插入a[high+1]。
 8  * @param arr 需要排序的数组
 9  * @return 排序完成的数组
10  * ?如果是递归应该怎么做?
11  */
12 public int[] sort(int[] arr) {
13     for (int i = 1; i < arr.length; i++) {
14         int temp = arr[i];
15         int low = 0;
16         int high = i - 1;
17         while (low <= high) {
18             int mid = (low + high) / 2;
19             if (temp < arr[mid]) {
20                 high = mid - 1;
21             } else {
22                 low = mid + 1;
23             }
24         }
25         for (int j = i; j >= low + 1; j--) {
26             arr[j] = arr[j - 1];
27         }
28         arr[high+1] = temp;
29     }
30     return arr;
31 }

-----------------------不稳定的

--------------------------------------------------------------------------选择排序

 1 /**
 2  * 选择排序
 3  * 对着一群数组说,你们谁最小出列,站到最后边
 4  * 然后继续对剩余的无序数组说,你们谁最小出列,站到最前边
 5  * 再继续刚才的操作,一直到最后一个,继续站到最前边,现在数组有序了,从小到大
 6  * @param arr 需要排序的数组
 7  * @return 排序完成的数组
 8  */
 9 public int[] sort(int[] arr) {
10     int minIndex = 0;
11     int temp = 0;
12     for (int i = 0; i < arr.length - 1; i++) {
13         minIndex = i;// 无序区的最小数据数组下标
14         for (int j = i + 1; j < arr.length; j++) {
15             // 在无序区中找到最小数据并保存其数组下标
16             if (arr[j] < arr[minIndex]) {
17                 minIndex = j;
18             }
19         }
20         if (minIndex != i) {
21             // 如果不是无序区的最小值位置不是默认的第一个数据,则交换之。
22             temp = arr[i];
23             arr[i] = arr[minIndex];
24             arr[minIndex] = temp;
25         }
26     }
27     return arr;
28 }

--------------------------------------------------------------------------希尔排序

 1 /**
 2  * 希尔排序 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。
 3  * 先在各组内进行直接插入排序;然后,取第二个增量d2=d1-1重复上述的分组和排序,直至所取的增量 =1,
 4  * 即所有记录放在同一组中进行直接插入排序为止。
 5  * @param arr 需要排序的数组
 6  * @return 排序完成的数组
 7  */
 8 public int[] sort(int[] arr) {
 9     int d = arr.length / 2;
10     while (true) {
11         for (int i = 0; i < d; i++) {// 分成几组,循环几次
12             for (int j = i; j + d < arr.length; j += d) {// 组内成员两两比较,从小到大排列
13                 int temp;
14                 if (arr[j] > arr[j + d]) {
15                     temp = arr[j];
16                     arr[j] = arr[j + d];
17                     arr[j + d] = temp;
18                 }
19             }
20         }
21         if (d == 1) {
22             break;
23         }
24         d--;
25     }
26     return arr;
27 }

--------------------------------------------------------------------------快速排序

 1 /**
 2  * 1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。
 3  * 2.j--由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
 4  * 3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
 5  * 4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中。
 6  * @param arr 需要排序的数组
 7  * @param low 首元素
 8  * @param high 末元素
 9  * @return 排序完成的数组
10  */
11 public int[] sort(int[] arr, int l, int r) {
12     if (l < r) {
13         int i = l, j = r, x = arr[l];
14         while (i < j) {
15             while (i < j && arr[j] >= x)
16                 // 从右向左找第一个小于x的数
17                 j--;
18             if (i < j)
19                 arr[i++] = arr[j];
20             while (i < j && arr[i] < x)
21                 // 从左向右找第一个大于等于x的数
22                 i++;
23             if (i < j)
24                 arr[j--] = arr[i];
25         }
26         arr[i] = x;
27         arr = sort(arr, l, i - 1); // 递归调用
28         arr = sort(arr, i + 1, r);
29     }
30     return arr;
31 }

--------------------------------------------------------------------------

原文地址:https://www.cnblogs.com/xkk112/p/4777986.html