笔试:基本排序方法

转载自:http://www.cnblogs.com/sevenyuan/archive/2009/12/04/1616897.html

冒泡排序、快速排序、选择排序、插入排序、希尔排序,甚至还有基数排序、鸡尾酒排序、桶排序、鸽巢排序、归并排序等。

  1 代码
  2
  3 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->package test.sort;
  4 import java.util.Random;
  5 //Java实现的排序类
  6 public class NumberSort {
  7     //私有构造方法,禁止实例化
  8     private NumberSort() {
  9         super();
 10     }
 11     //冒泡法排序
 12     public static void bubbleSort(int[] numbers) {
 13         int temp; // 记录临时中间值
 14         int size = numbers.length; // 数组大小
 15         for (int i = 0; i < size - 1; i++) {
 16             for (int j = i + 1; j < size; j++) {
 17                 if (numbers[i] < numbers[j]) { // 交换两数的位置
 18                     temp = numbers[i];
 19                     numbers[i] = numbers[j];
 20                     numbers[j] = temp;
 21                 }
 22             }
 23         }
 24     }
 25     //快速排序
 26     public static void quickSort(int[] numbers, int start, int end) {
 27         if (start < end) {
 28             int base = numbers[start]; // 选定的基准值(第一个数值作为基准值)
 29             int temp; // 记录临时中间值
 30             int i = start, j = end;
 31             do {
 32                 while ((numbers[i] < base) && (i < end))
 33                     i++;
 34                 while ((numbers[j] > base) && (j > start))
 35                     j--;
 36                 if (i <= j) {
 37                     temp = numbers[i];
 38                     numbers[i] = numbers[j];
 39                     numbers[j] = temp;
 40                     i++;
 41                     j--;
 42                 }
 43             } while (i <= j);
 44             if (start < j)
 45                 quickSort(numbers, start, j);
 46             if (end > i)
 47                 quickSort(numbers, i, end);
 48         }
 49     }
 50     //选择排序
 51     public static void selectSort(int[] numbers) {
 52         int size = numbers.length, temp;
 53         for (int i = 0; i < size; i++) {
 54             int k = i;
 55             for (int j = size - 1; j > i; j--) {
 56                 if (numbers[j] < numbers[k])
 57                     k = j;
 58             }
 59             temp = numbers[i];
 60             numbers[i] = numbers[k];
 61             numbers[k] = temp;
 62         }
 63     }
 64     //插入排序
 65     // @param numbers
 66     public static void insertSort(int[] numbers) {
 67         int size = numbers.length, temp, j;
 68         for (int i = 1; i < size; i++) {
 69             temp = numbers[i];
 70             for (j = i; j > 0 && temp < numbers[j - 1]; j--)
 71                 numbers[j] = numbers[j - 1];
 72             numbers[j] = temp;
 73         }
 74     }
 75     //归并排序
 76     public static void mergeSort(int[] numbers, int left, int right) {
 77         int t = 1;// 每组元素个数
 78         int size = right - left + 1;
 79         while (t < size) {
 80             int s = t;// 本次循环每组元素个数
 81             t = 2 * s;
 82             int i = left;
 83             while (i + (t - 1) < size) {
 84                 merge(numbers, i, i + (s - 1), i + (t - 1));
 85                 i += t;
 86             }
 87             if (i + (s - 1) < right)
 88                 merge(numbers, i, i + (s - 1), right);
 89         }
 90     }
 91     //归并算法实现
 92     private static void merge(int[] data, int p, int q, int r) {
 93         int[] B = new int[data.length];
 94         int s = p;
 95         int t = q + 1;
 96         int k = p;
 97         while (s <= q && t <= r) {
 98             if (data[s] <= data[t]) {
 99                 B[k] = data[s];
100                 s++;
101             } else {
102                 B[k] = data[t];
103                 t++;
104             }
105             k++;
106         }
107         if (s == q + 1)
108             B[k++] = data[t++];
109         else
110             B[k++] = data[s++];
111         for (int i = p; i <= r; i++)
112             data[i] = B[i];
113     }
114
115 }

时间: 2024-10-24 19:50:47

笔试:基本排序方法的相关文章

笔试算法题(53):四种基本排序方法的性能特征(Selection,Insertion,Bubble,Shell)

四种基本算法概述: 基本排序:选择,插入,冒泡,希尔.上述算法适用于小规模文件和特殊文件的排序,并不适合大规模随机排序的文件.前三种算法的执行时间与N2成正比,希尔算法的执行时间与N3/2(或更快)成正比: 前三种算法在平均,最坏情况下都是N2,而且都不需要额外的内存:所以尽管他们的运行时间只相差常数倍,但运行方式不同: 对于已经就序的序列而言,插入排序和冒泡排序的运行时间都是O(N),但是选择排序的时间仍旧是O(N^2): 因为Insertion和Bubble都是相邻项间的比较交换,所以不会出

【学习ios之路:Objective-C】OC中常用的系统排序方法

①.OC中常用排序方法: 1).不可变数组 - (NSArray *)sortedArrayUsingSelector:(SEL)comparator; - (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr; 2)可变数组 - (void)sortUsingSelector:(SEL)comparator; - (void)sortUsingComparator:(NSComparator)cmptr; 3).字典排序 - (NS

Java实现几种常见排序方法

转自:http://www.cnblogs.com/sevenyuan/archive/2009/12/04/1616897.html 日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序,甚至还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.归并排序等. 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经

Java几种常用的实现排序方法

import java.util.Random; public class NumberSort{ /** * 私有构造方法,禁止实例化 */ private NumberSort(){ super(); } /** * 冒泡排序 * 比较相邻的元素.如果第一个比第二个大,就叫唤他们两个位置. * 对每一组相邻的元素作同样的工作,从开始的第一对到结束后的最后一对,这样剩下的最后一个应该是最大的数. * 针对所有元素重复以上操作,除了最后一个. * 持续对越来越少的数进行以上的操作,直到没有任何一

简单排序方法

排序: 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困难.同样,存储在计算机中的数据的次序,对于处理这些数据的算法的速度和简便性而言,也具有非常深远的意义. 基本概念: 排序是把一个记录(在排序中把数据元素称为记录)集合或序列重新排列成按记录的某个数据项值递增(或递减)的序列. 下表是一个学生成绩表,其中某个学生记录包括学号.姓名及计算机文化基础.C 语言.数据结构等课程的成绩和总成绩等数据项.在排序时,

c#实现几种排序方法

插入排序 1.简介 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间. 2.算法描述 一般来说,插入排序都采用in-place在数组上实现.具体算法描述如下:1.从第一个元素开始,该元素可以认为已经被排序2.

数组重排序方法

今天在复习的过程中,发现自己对数组的重排序方法sort()一直存在一个误区,重新捋顺,在此记录... 数组中存在两个可以直接用来重排序的方法:reverse()和sort(),reverse()方法就是反转数组项的顺序.在默认情况下,sort()方法按升序排列数组项,在这个过程中sort方法会调用每个数组项的toString()转型方法,然后比较得到的字符串,然后确定排序.之前一直没有注意到这一点,一直以为调用sort()方法过后会直接对一个数组进行正确排序,其实并不是这样,而是对得到的字符串进

JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)

1.使用对象字面量定义对象 var person={}; 使用这种方式创建对象时,实际上不会调用Object构造函数. 开发人员更喜欢对象字面量的语法. 2.有时候需要传递大量可选参数的情形时,一般来讲使用对象字面量来封装多个可选参数. 3.对象属性的点表示法与方括号表示法的区别 (1)功能上:两者没区别 (2)但是方括号的有点是可以通过变量来访问属性 例如: var person={ name:"Nic" } 点表示法:person.name 方括号表示法:var prop=“nam

Array的队列方法&amp;重排序方法—— JS学习笔记2015-6-27(第68天)

队列方法 相对于栈数据结构的后进先出[LIFO]访问规则,队列数据结构的访问规则是先进先出[FIFO] 这里提到一个方法  shift(); 它能够移除数组中的第一个项,并返回该项,同时将数组长度减1:// 有点像pop() 实例: var colors = ['red','green']; var item = colors.shift(); alert(colors);  // green alert(item);  // red alert(colors.length)  // 1; 同时

Python学习——数据排序方法

Python对数据排序又两种方法: 1. 原地排序:采用sort()方法,按照指定的顺序排列数据后用排序后的数据替换原来的数据(原来的顺序丢失),如: >>> data1=[4,2,6,432,78,43,22,896,42,677,12] >>> data1.sort() >>> data1 #原来的顺序被替换 [2, 4, 6, 12, 22, 42, 43, 78, 432, 677, 896] 2. 复制排序:采用sorted()内置函数,按照