常见排序算法及其java实现
最近学习了下java,感觉java在基本语法上与C++非常相似。作为练习,我用java实现了冒泡排序、选择排序、插入排序、基尔排序、快速排序、堆排序、计数排序、合并排序。
以下为实现代码:
- public class Sort{
- public void print_arr(int[] arr){
- int len = arr.length;
- for (int i = 0; i < len; i++){
- System.out.print("" + arr[i] + " ");
- }
- System.out.println("");
- }
- public int[] dup_arr(int[] arr){
- int len = arr.length;
- int re[] = new int[len];
- for (int i = 0; i < len; i++){
- re[i] = arr[i];
- }
- return re;
- }
- public int[] bubble(int[] arr){
- int dup[] = this.dup_arr(arr);
- int len = dup.length;
- int tmp = 0;
- for (int i = 0; i < len; i++){
- for (int j = 0; j < len - 1 - i; j++){
- if (dup[j] < dup[j+1]){
- tmp = dup[j];
- dup[j] = dup[j+1];
- dup[j+1] = tmp;
- }
- }
- }
- return dup;
- }
- public int[] selection(int[] arr){
- int dup[] = this.dup_arr(arr);
- int len = dup.length;
- int tmp = 0;
- int max = 0;
- for (int i = 0; i < len; i++){
- max = i;
- for (int j = i + 1; j < len; j++){
- if (dup[j] > dup[max]){
- max = j;
- }
- }
- tmp = dup[i];
- dup[i] = dup[max];
- dup[max] = tmp;
- }
- return dup;
- }
- public int[] insertion(int[] arr){
- int dup[] = this.dup_arr(arr);
- for (int i = 1; i < dup.length; i++){
- int key = dup[i];
- int j = i - 1;
- while (j >= 0 && dup[j] < key){
- dup[j + 1] = dup[j];
- j--;
- }
- dup[j + 1] = key;
- }
- return dup;
- }
- public int[] shell(int[] arr, int step){
- int dup[] = this.dup_arr(arr);
- while (step > 0){
- //insertion sorting
- for (int i = step; i < dup.length; i += step){
- int j = i - step;
- int key = dup[i];
- while (j >= 0 && dup[j] < key){
- dup[j + step] = dup[j];
- j -= step;
- }
- dup[j + step] = key;
- }
- step = step / 2;
- }
- return dup;
- }
- public void quick(int[] dup, int leftpoint, int rightpoint){
- if (leftpoint >= rightpoint){
- return;
- }
- int key = dup[rightpoint];
- int left = leftpoint;
- int right = rightpoint;
- while (true){
- while (left < right && dup[left] >= key){
- left++;
- }
- while (left < right && dup[right] <= key){
- right--;
- }
- int tmp = 0;
- if (left >= right){
- tmp = dup[right];
- dup[right] = key;
- dup[rightpoint] = tmp;
- break;
- }
- tmp = dup[right];
- dup[right] = dup[left];
- dup[left] = tmp;
- }
- this.quick(dup, leftpoint, left - 1);
- this.quick(dup, left + 1, rightpoint);
- }
- //min heap
- public int micro_adjust(int[] arr, int i, int last){
- if (2 * i + 1 > last){
- return i;
- }
- int max = arr[i] < arr[2 * i + 1] ? i : (2 * i + 1);
- if (2 * i + 2 > last){
- return max;
- }
- max = arr[max] < arr[2 * i + 2] ? max : (2 * i + 2);
- if (max != i){
- int tmp = arr[i];
- arr[i] = arr[max];
- arr[max] = tmp;
- }
- return max;
- }
- //part of heap sorting. build a min heap
- public void build_heap(int[] arr, int last){
- int mid = (last + 1) / 2 - 1;
- for (int i = mid; i >= 0; i--){
- int tmp = micro_adjust(arr, i, last);
- //System.out.print("i: " + i + " tmp: " + tmp + "arr: ");
- //this.print_arr(arr);
- int flag = i;
- while (tmp <= mid && tmp != flag){
- flag = tmp;
- tmp = micro_adjust(arr, tmp, last);
- }
- }
- return;
- }
- //part of heap sorting. adjust the left arr
- public void adjust_heap(int[] arr, int last){
- int tmp = arr[0];
- arr[0] = arr[last];
- arr[last] = tmp;
- this.build_heap(arr, last - 1);
- return;
- }
- //use min heap to sort arr from big to small
- public int[] heap(int[] arr){
- int dup[] = this.dup_arr(arr);
- this.build_heap(dup, dup.length - 1);
- for (int i = 0; i < dup.length; i++){
- //System.out.print("i: " + i + " arr: ");
- //this.print_arr(dup);
- adjust_heap(dup, dup.length - 1 - i);
- }
- return dup;
- }
- public int[] counting(int[] arr){
- int min = arr[0];
- int max = arr[0];
- for (int i = 1; i < arr.length; i++){
- min = min < arr[i] ? min : arr[i];
- max = max > arr[i] ? max : arr[i];
- }
- int buckets[] = new int[max - min + 1];
- int index = 0;
- for (int i = 0; i < arr.length; i++){
- index = arr[i] - min;
- buckets[index]++;
- }
- int res[] = new int[arr.length];
- for (int i = 0; i < res.length; i++){
- res[i] = -1;
- }
- for (int i = 0; i < arr.length; i++){
- index = arr[i] - min;
- int cnt = 0;
- for (int j = 0; j < index; j++){
- cnt += buckets[j];
- }
- while (res[res.length - 1 - cnt] != -1){
- cnt++;
- }
- res[res.length - 1 - cnt] = arr[i];
- }
- return res;
- }
- /*Failure: don't know how to build the buckets arr ......
- public int[] radix(int[] arr){
- int dup[] = this.dup_arr(arr);
- Queue[] buckets = new Queue[10];
- for (int i = 0; i < 10; i++){
- buckets[i] = new LinkedList();
- }
- int max = dup[0];
- for (int i = 1; i < dup.length; i++){
- max = max > dup[i] ? max : dup[i];
- }
- int n = 10;
- while (max > 0){
- for (int i = 0; i < dup.length; i++){
- buckets[dup[i] % n].add(dup[i]);
- }
- int j = 0;
- for (int i = 0; i < 10; i++){
- while (!buckets[i].isEmpty()){
- dup[j++] = buckets[i].getFirst();
- buckets[i].removeFirst();
- }
- }
- max /= 10;
- n *= 10;
- }
- return dup;
- }
- */
- //part of merge sorting: merge two arr together
- public int[] merge(int[] arr1, int[] arr2){
- int res[] = new int[arr1.length + arr2.length];
- int i = 0;
- int j = 0;
- int k = 0;
- while (i < arr1.length && j < arr2.length){
- if (arr1[i] > arr2[j]){
- res[k++] = arr1[i++];
- }else{
- res[k++] = arr2[j++];
- }
- }
- while (i < arr1.length){
- res[k++] = arr1[i++];
- }
- while (j < arr2.length){
- res[k++] = arr2[j++];
- }
- return res;
- }
- //the main part of merge_sort
- public int[] merge_sort(int[] arr, int start, int end){
- //System.out.println("start: " + start + " end: " + end);
- if (end - start < 1){
- //System.out.println("end == start");
- int tmp[] = {arr[start]};
- return tmp;
- }
- int flag = (end - start) / 2;
- int res1[] = merge_sort(arr, start, start + flag);
- //System.out.println("res1:");
- //this.print_arr(res1);
- int res2[] = merge_sort(arr, start + flag + 1, end);
- //System.out.println("res2:");
- //this.print_arr(res2);
- int res[] = merge(res1, res2);
- //this.print_arr(res);
- return res;
- }
- public static void main(String[] args){
- int arr[] = {6, 6, 7, 5, 3, 2, 4, 1, 8, 9, 0};
- Sort s = new Sort();
- System.out.print("The original array: ");
- s.print_arr(arr);
- System.out.print("after bubble sorting: ");
- s.print_arr(s.bubble(arr));
- System.out.print("after selection sorting: ");
- s.print_arr(s.selection(arr));
- System.out.print("after insertion sorting: ");
- s.print_arr(s.insertion(arr));
- System.out.print("after shell sorting: ");
- s.print_arr(s.shell(arr, arr.length/2));
- System.out.print("after quick sorting: ");
- int dup[] = s.dup_arr(arr);
- s.quick(dup, 0, dup.length - 1);
- s.print_arr(dup);
- System.out.print("after heap sorting: ");
- s.print_arr(s.heap(arr));
- System.out.print("after counting sorting: ");
- s.print_arr(s.counting(arr));
- //failure: because don't know how to define buckets
- //System.out.print("after radix sorting: ");
- //s.print_arr(s.radix(arr));
- //failure: because don't know how to define buckets
- //System.out.print("after buckets sorting: ");
- //s.print_arr(s.buckets(arr));
- System.out.print("after merge sorting: ");
- dup = s.dup_arr(arr);
- s.print_arr(s.merge_sort(dup, 0, dup.length - 1));
- }
- }
常见排序算法及其java实现的更多相关文章
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- 常见排序算法总结 -- java实现
常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...
- 常见排序算法(java实现)
常见排序算法介绍 冒泡排序 代码: public class BubbleSort { public static void sort(int[] array) { int tValue; for ( ...
- 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)
排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列. 稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关 ...
- 几种常见排序算法的java实现
一.几种常见的排序算法性能比較 排序算法 最好时间 平均时间 最坏时间 辅助内存 稳定性 备注 简单选择排序 O(n^2) O(n^2) O(n^2) O(1) 不稳定 n小时较好 直接插入排序 O( ...
- 常见排序算法及Java实现
先上个总图↓: ①.直接插入排序 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并 ...
- 六种常见排序算法的java实现
package edu.cn.ysw; //八种排序算法的实现与效率分析 /* * 内排序的种类: * 1.插入排序:直接插入排序.希尔排序. * 2.选择排序:简单选择排序.堆排序. 3.交换排序: ...
- 常见排序算法题(java版)
常见排序算法题(java版) //插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.Sor ...
- Java基础语法(8)-数组中的常见排序算法
title: Java基础语法(8)-数组中的常见排序算法 blog: CSDN data: Java学习路线及视频 1.基本概念 排序: 是计算机程序设计中的一项重要操作,其功能是指一个数据元素集合 ...
随机推荐
- 使用委托的BeginInvoke方法来完成复杂任务的操作
现在假设我有这样一个窗体(包含一个进度条和一个按钮与两个文本框),在第一个文本框中输入一个数字进行阶乘运算,在此过程中进度条与运算进度保持一致,同时可以在第二个文本框中进行其它工作(比如输入).对付这 ...
- [POJ 2429] GCD & LCM Inverse
GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10621 Accepted: ...
- MEX文件编写和调试
作者kaien,2010/02/16 以前我写过一篇文章,详细的介绍过MEX的格式,语法,编译,调试等.可惜记不清放在哪里了.而最近又用到MEX编程,所以只能重新温习一番.时间有限,只记下简要流程和注 ...
- Kooboo CMS的安装步骤
Kooboo CMS的安装步骤 来自Kooboo document 跳转到: 导航, 搜索 http://www.microsoft.com/web/gallery/install.aspx?appi ...
- 浏览器插件 - Chrome 对 UserScript 的声明头(metadata)兼容性一览
1.这里的UserScript指的是,油猴插件或者Tampermonkey插件等支持的格式如下例子: // ==UserScript== // @name // @namespace http://A ...
- Ajax异步请求-简单模版
<script type="text/javascript"> window.onload = function () { document.getElementByI ...
- faplayer编译配置经验
最近在做在线m3u8类格式的视频直播应用, 在获取m3u8的文件之后,如果采用Android系统播放器来播,会有各种各样的问题,容易卡死.不连续,也不能自定义一些选项.查找资料以后,决定采用fapla ...
- 在生成 Visual c + + 2005年或从 DLL 文件中使用 CString 派生的类的 Visual c + +.net 应用程序时,您可能会收到 LNK2019 错误消息
http://support.microsoft.com/kb/309801
- Android实例-设置消息提醒(XE8+小米2)
相关资料: 1.官网实例:http://docwiki.embarcadero.com/RADStudio/XE5/en/Mobile_Tutorial:_Using_the_Notification ...
- PT100测温电路经验
P100电压采集放大电路:前半部分是4.096V恒压源电路,然后是一个桥式电压采样电路,后面是一个电压放大电路. 一 4.096V恒压源电路: 因Vref = 2.5V,故有4.096 = (1 + ...