多种排序算法的思路和简单代码的实现(一)

就自己简单的理解了一些排序算法(JAVA)思路和代码分享给大家:欢迎大家进行交流。

直接插入排序,折半插入排序,冒泡排序,快速排序

 1 public class Sort {
 2     /*
 3      * 直接插入排序: 先确定一个有序数组,然后把插入的数与有序数组从最后依次进行比较, 直到插入的数比有序数组的数大,此数换为插入的数字,从此位置以后
 4      * 的数依次向后移动一位。
 5      */
 6     public static void insert(int[] a) {
 7         for (int i = 1; i < a.length; i++) {
 8             int b = a[i], j;
 9             for (j = i - 1; j >= 0 && b < a[j]; j--) {
10                 a[j + 1] = a[j];
11             }
12             a[j + 1] = b;
13
14         }
15     }
16
17     /*
18      * 折半插入排序法: 对有序数组确定最小下标,最大下标, 然后将插入的值与中间值进行比较,
19      * 如果小于中间值,则最大下标为中间下标-1,否则最小下标为中间下标+1; 循环确定插入位置为最小下标,然后把插入的数字赋值给最小下标对应
20      * 的数,后面的数依次往后移动一位。
21      */
22     public static void halfInsert(int[] a) {
23         for (int i = 1; i < a.length; i++) {
24             int b = a[i], low = 0, high = i - 1;
25             while (low <= high) {
26                 int mid = (low + high) / 2;
27                 if (b > a[mid]) {
28                     low = mid + 1;
29                 } else {
30                     high = mid - 1;
31                 }
32             }
33
34             for (int j = low; j < i; j++) {
35                 a[j + 1] = a[j];
36             }
37             a[low] = b;
38         }
39
40     }
41
42     /*
43      * 冒泡排序: 双重循环,最多进行n-1趟排序,每相邻两个数进行比较,如果前面的大,则进行交换,
44      * 用exchange判断两数是否变换了,如果没有变换,则不必再进行上述步骤进行排序,直接输出结果。
45      */
46     public static void bubblseSort(int[] a) {
47         boolean exchange = true;// 是否交换的标志
48         for (int i = 1; i < a.length && exchange; i++) {
49             exchange = false;
50             for (int j = 0; j < a.length - 1; j++) {
51                 if (a[j + 1] < a[j]) {
52                     int b = a[j + 1];
53                     a[j + 1] = a[j];
54                     a[j] = b;
55                     exchange = true;
56                 }
57             }
58
59         }
60     }
61 /*
62  * 快速排序算法:
63  * 找第一个数做基准量,从后往前找,比基准量大的数放到后边,小的就把数往前移动,
64  * 从前往后找,比基准量小的放到前面,大的就往后移动,
65  * 循环执行上述步骤,直到前后端序列都变为1个数为止,用递归算法实现。
66  */
67     public static void quickSort(int[] a, int b, int e) {
68         int i = b, j = e, x = a[i];
69         while (i < j) {
70             while (i < j && x < a[j])
71                 j--;
72             if (i < j)
73                 a[i++] = a[j]; // 后端小的数向前移动
74             while (i < j && x > a[i])
75                 i++;
76             if (i < j)
77                 a[j--] = a[i]; // 前端大的数向后移动
78
79         }
80         ;
81         // 此时,i=j;
82         a[i] = x;
83         if (b < i)
84             quickSort(a, b, i - 1);
85         if (i < e)
86             quickSort(a, i + 1, e);
87     }
88 }
时间: 2024-10-05 05:02:02

多种排序算法的思路和简单代码的实现(一)的相关文章

多种排序算法的思路和简单代码的实现(三)

下面是和快速排序,堆排序,相媲美的归并排序,时间复杂度都为O(nLog2n). 对于归并排序中出现的递归算法,调用的函数顺序以及如何返回,大家可以访问这个网址来详细理解 http://blog.csdn.net/cinderella_hou/article/details/51763681 个人看了,非常受益.. 1 /* 2 * 归并排序: 先递归分解数列,再合并数列,就是归并.归并排序是稳定的. 3 */ 4 public static void mergSort(int[] a) { 5

多种排序算法的比较

1.冒泡排序和选择排序 为什么把冒泡排序和选择排序放在一块儿呢?因为我发现他们两个有点像. 冒泡排序是不停的把最大的元素换到数组的最右端. 而选择排序是把最小的元素换到最左端. 看到这儿,你是不是觉得冒泡和选择好像没啥区别啊,把最大换成最小就成了一种新的算法?那我也来一个? 其实,无论换最大还是最小,都无关紧要,就算冒泡变成换最小的元素换到数组的最左端,那它也叫冒泡排序的. 冒泡排序的描述:它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进

常见排序算法思路和简单代码实现

算法名称 算法思路 简单代码实现                        

排序算法(一)3种简单排序(选择,冒泡,插入)

排序是数据处理中十分常见且核心的操作,虽说实际项目开发中很小几率会需要我们手动实现,毕竟每种语言的类库中都有n多种关于排序算法的实现.但是了解这些精妙的思想对我们还是大有裨益的.本文简单温习下最基础的三类算法:选择,冒泡,插入. 先定义个交换数组元素的函数,供排序时调用 /** * 交换数组元素 * @param arr * @param a * @param b */ public static void swap(int []arr,int a,int b){ arr[a] = arr[a]

最全排序算法原理解析、java代码实现以及总结归纳

算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序. 详情如下: 算法评估 排序算法的性能依赖于以下三个标准: 稳定性:如果a原本在b前面,而a=b,排序之后a仍然在b的前面,则稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在

常用排序算法简介以及Java实现代码

排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列.分内部排序和外部排序.若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序.反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序. 稳定排序:假设在待排序的文件中,存在两个或两个以上的记录具有相同的关键字,在用某种排序法排序后,若这些相同关键字的元素的相对次序仍然不变,则这种排序方法是稳定的. 冒泡,插入,基数,归并属于稳定排序 选择,快速,希尔,堆

多种排序算法整理

最近面试一直问到排序,老是各种搞混,特地来整理整理 先盗用一张图: 说明: 内部排序基于内存,外部排序是数据量大,而内存与外存的相结合的排序 一.插入排序 关键词:插入,将数字插入到一条已经排好序的有序表中. 1.1直接插入排序 假设要5,4,2,3,1 要升序排列. i=1 5 i=2 5,4    ==>4,5 i=3 4,5,2 ===>2,4,5 i=4 2,4,5,3 ==>2,3,4,5 ... 思想很简单,就是从一个元素开始,一个个元素添加,返回有序列表. 其复杂度为  

常见排序算法的亲手实现(代码与注释)

1 package sort; 2 3 import java.util.ArrayList; 4 import java.util.Random; 5 6 public class Sort 7 { 8 9 public static Random r = new Random(); 10 11 // public static transient ArrayList<String> arr = new 12 // ArrayList<String>();//动态 transie

多种排序算法

插入排序 已经有一个排好的序列,要将新元素放到序列合适的位置. int *InsertSortA(int *R,n) { int i,j; for(j=1;j<n;j++) { i=j-1; tmp=R[j]; while(i>=0&&R[i]<tmp) { R[i+1]=R[i]; i--; } R[i+1]=tmp; } return R: } 上述算法中每次都要判断i是否小于0,可以让数组第一个元素是一个很小的值,使得R[0]<min{Ri},i为1到n,整个