集中常用排序算法代码

  1 public class CheckSum {
  2
  3     /**
  4      * 计算数组中数据之后为sum的两个数字
  5      * @param array
  6      * @param sum
  7      */
  8     public void findTheSum(int array[], int sum) {
  9
 10         //Arrays.sort(array);
 11
 12         int[] copy = new int[array.length];
 13
 14         MergeOrder(array, copy, 0, array.length - 1);
 15 //        fastOrder(array, 0, array.length - 1);
 16         System.out.println(array);
 17         int row = 0, high = array.length - 1;
 18         while (row < high) {
 19
 20             if (array[row] + array[high] > sum) {
 21                 high--;
 22             } else if (array[row] + array[high] < sum) {
 23                 row++;
 24             } else {
 25                 System.out.println(array[row] + " " + array[high]);
 26                 if (high - 1 >= 0 && array[high] == array[high - 1]) {
 27                     high--;
 28                     continue;
 29                 }
 30
 31                 if (high - 1 >= 0 && array[row] == array[row + 1]) {
 32                     row++;
 33                     continue;
 34                 }
 35
 36                 row++;
 37                 high--;
 38             }
 39
 40         }
 41     }
 42
 43
 44
 45     //小堆排序
 46
 47     public void duiSortedOrder(int array[], int index,int len) {
 48
 49         int tempt = array[index];
 50         for (int i = 2 * index + 1; i <= len; i = i * 2 + 1) {
 51             if(i<len&&array[i]>array[i+1]) i++;
 52             if(tempt<array[i]) break;
 53             array[index] = array[i];
 54             index = i;
 55         }
 56         array[index] = tempt;
 57     }
 58
 59
 60     //直接插入法
 61     public void InsertOrder(int array[]) {
 62
 63         for (int i = 1; i < array.length; i++) {
 64             int tempt = array[i], j = i - 1;
 65             for (; j >= 0 && tempt < array[j]; j--) {
 66                 array[j + 1] = array[j];
 67             }
 68             array[j + 1] = tempt;
 69         }
 70     }
 71
 72
 73
 74
 75     /**
 76      * 归并排序
 77      * @param array
 78      * @param copy
 79      * @param low
 80      * @param high
 81      */
 82     public void MergeOrder(int[] array, int[] copy, int low, int high) {
 83
 84         if (low == high) return;
 85
 86         int mid = (low + high) >> 1;
 87
 88         MergeOrder(array, copy, low, mid);
 89
 90         MergeOrder(array, copy, mid+1, high);
 91
 92         //把元素聚合在一起
 93         int left = low;
 94         int right = mid+1;
 95         int cindex = low;
 96         while (left<=mid && right <=high) {
 97
 98             if (array[left] < array[right]) {
 99                 copy[cindex++] = array[left++];
100             } else {
101                 copy[cindex++] = array[right++];
102             }
103         }
104
105         for (; left <= mid; ) {
106             copy[cindex++] = array[left++];
107         }
108
109         for (; right <=high; ) {
110             copy[cindex++] = array[right++];
111         }
112
113
114         //把排序之后的元素放置到 array中
115
116         for (int i = low; i < cindex; i++) {
117             array[i] = copy[i];
118         }
119         return;
120     }
121
122
123     /**
124      * 快速排序
125      *
126      * @param array
127      * @param row
128      * @param high
129      */
130     public void fastOrder(int[] array, int row, int high) {
131
132         if (row < high) {
133             int mid = Order(array, row, high);
134             fastOrder(array, row, mid - 1);
135             fastOrder(array, mid + 1, high);
136         }
137
138     }
139
140
141     public int Order(int[] array, int row, int high) {
142
143         int tempt = array[row];
144
145         while (row < high) {
146
147             while (tempt < array[high] && high > row) {
148
149                 high--;
150             }
151
152             array[row] = array[high];
153
154             while (tempt > array[row] && row < high) {
155                 row++;
156             }
157             array[high] = array[row];
158         }
159
160         array[row] = tempt;
161         return row;
162
163     }
164
165
166
167      public static void main(String... args) {
168         CheckSum checkSum = new CheckSum();
169
170         int[] params = new int[]{8, 7, 6, 5, 4, 3, 2};
171         for (int i = params.length / 2 - 1; i >= 0; i--) {
172             checkSum.duiSortedOrder(params, i,params.length-1);
173         }
174
175         //输出排序后的数据
176
177         for (int i = 0; i <= params.length-1; i++) {
178             System.out.println(params[0]);
179             params[0] = params[params.length - 1 - i];
180             checkSum.duiSortedOrder(params, 0, params.length - 1 - i);
181         }
182
183
184         checkSum.InsertOrder(params);
185         System.out.println(params);
186
187     }
188 }

原文地址:https://www.cnblogs.com/09120912zhang/p/9651359.html

时间: 2024-12-22 05:25:12

集中常用排序算法代码的相关文章

常用排序算法之——归并排序

归并排序的原理: 如果数组的元素个数大于1,则: 将数组平均分为两部分: 左边的数组归并排序:递归 右边的数组归并排序:递归 将两个各自有序的数组合并,需要一个额外的辅助数组,暂时保存合并结果:返回 否则,数组元素个数为1时,已经有序:直接返回. 稳定排序.时间复杂度在最坏.最好.平均情况下都为O(N lgN),空间复杂度为O(N). 代码: 1 #include <iostream> 2 using namespace std; 3 4 template<typename T>

常用排序算法之——快速排序

快速排序的原理: 首先找一个标兵值,等于某一个元素值:遍历数组,将数组分为小于标兵值和大于标兵值的两部分:然后分别对两个部分采用快速排序,递归. 分开数组时,维持一个指针,指向已找到小部分的最后一个元素:一个指针用于遍历. 不稳定排序算法.当数组已经有序时,时间复杂度最差,为O(N2),平均.最优情况下都为O(N lgN). 代码如下: 1 #include <iostream> 2 using namespace std; 3 4 template<typename T> 5 v

javascript常用排序算法实现

毕业后,由于工作中很少需要自已去写一些排序,所以那些排序算法都忘得差不多了,不过排序是最基础的算法,还是不能落下啦,于是找了一些资料,然后用Javascript实现了一些常用的算法,具体代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>

几种常用排序算法温习

几种常用排序算法温习 一. 简单排序方法 1.直接插入排序 基本思想:顺序地将待排序的记录按其关键码的大小插入到已排序的记录子序列的适当位置. 算法代码: //直接插入排序 public static void InsertSort(SeqList<int> seq) { if (seq.IsEmpty() || seq.GetLength() == 1) return; Console.Write("1.1 简单排序 排序前:"); seq.Display(); int

几种常用排序算法的python实现

1:快速排序 思想: 任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序. 一趟快速排序的算法是: 1)设置两个变量i.j,排序开始的时候:i=0,j=N-1: 2)以第一个数组元素作为关键数据,赋值给key,即key=A[0]: 3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]赋给A[i]: 4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大

几种常用排序算法 (一)

八大常用排序算法详细分析 包括复杂度: 排序有可以分为以下几类: (1).交换排序:冒泡排序.快速排序 (2).选择排序:直接选择排序.堆排序 (3).插入排序:直接插入排序.希尔排序 (4).归并排序 (5).基数排序(桶排序) 1.冒泡排序 顾名思义,冒泡排序就是用气泡从下往上冒的原理,将气泡(较小或较大的数)依次往前移. 具体做法(升序):设总共有N个元素,则至少需要进行N-1次冒泡.一次排序排序中,若前一个元素大于后一个元素,则交换两个元素,然后在依次判  断后面两两相邻元素大小并进行交

常用排序算法的python实现

排序算是编程最基本的算法问题之一了,熟练掌握排序算法也能加深自己对数据结构的理解,也能提高自己的编程能力,以下为个人参考许多大神博客后对常用排序算法的学习总结. 目录: 概述 冒泡排序 直接插入排序 简单选择排序 希尔排序 堆排序 归并排序 快速排序 算法的比较与测试 参考 1. 概述 所谓排序(sorting)就是整理数据的序列,使其按照特定顺序排列的操作.排序在现实生活中(如整理书籍,表格数据等),在计算领域中(如二分查找,图论的最小生成树的Kruskal算法)均有重要意义,所以一种高效的排

常用排序算法及其实现

一.常用排序算法及滑稽实现 1. 插入排序:遍历数组(n),将每个元素插入到前面子序列的合适位置(插入时采取前面的部分元素后移,再将本元素填在适当位置的方法) 平均:O(n2) 最坏:O(n2) 最好:O(n)(有序时出现) 稳定性:稳定(相同元素在排序之后相对位置不会改变) 模拟: 12 30 9 100 1 3 10 12 30 9 100 1 3 10 9 12  30 100 1 3 10 9 12 30 100 1 3 10 1 9 12 30 100 3 10 1 3 9 12  3

常用MD5算法代码

常用的MD5算法代码日期: 2014年8月4日作者: 铁锚 MD5,全称为 Message Digest Algorithm 5(消息摘要算法第五版).详情请参考 维基百科:MD5 MD5加密后是一个字节数组, 但我们一般是取其十六进制的字符串表示法,当然,十六进制数字符串是区分大小写,在 mysql数据库,Java,和JavaScript语言中,一般是使用小写的字符串来表示, 而在 Oracle数据库官方提供的包中,返回的是大写字符串,这算是一个坑,如果你想要执行多次 md5,可能需要转换为小