交换排序
:
包括冒泡排序,快速排序。
冒泡排序法
:
该算法是专门针对已部分排序的数据进行排序的一种排序算法。如果在你的数据清单中只有一两个数据是乱序的话,用这种算法就是最快的排序算法。如果你的数据
清单中的数据是随机排列的,那么这种方法就成了最慢的算法了。因此在使用这种算法之前一定要慎重。这种算法的核心思想是扫描数据清单,寻找出现乱序的两个
相邻的项目。当找到这两个项目后,交换项目的位置然后继续扫描。重复上面的操作直到所有的项目都按顺序排好。
关于冒泡排序,网上有好几种实现方法,在这里整理一下,方便以后自己复习:
第一种方法:
源码:
package
com.zhaozy.sort;
import
java.util.Random;
/**
*
冒泡排序
*
*
@author
zhaozy
*
*/
public
class
MaopaoSort {
public
static
void
main(String[] args) {
int
[] dataset =
new
int
[20];
Random random =
new
Random();
System.
out
.println(
"Befor sorted:"
);
for
(
int
i = 0; i < dataset.
length
; i++) {
dataset[i] = (
int
) (random.nextDouble() * 100);
System.
out
.print(dataset[i] +
" "
);
}
System.
out
.println();
testMaopao
(dataset);
}
public
static
void
testMaopao(
int
[] dataset) {
int
temp = 0;
for
(
int
i = 0; i < dataset.
length
; i++) {
for
(
int
j = 0; j < dataset.
length
- i - 1; j++) {
if
(dataset[j] > dataset[j + 1]) {
temp = dataset[j];
dataset[j] = dataset[j + 1];
dataset[j + 1] = temp;
}
}
}
printNum
(dataset);
}
//
负责显示出排好序的数组
public
static
void
printNum(
int
[] dataset) {
// StringBuffer result=new StringBuffer();
String result =
""
;
for
(
int
i = 0; i < dataset.
length
; i++) {
result += dataset[i] +
" "
;
}
System.
out
.println(
"After sorted:"
);
System.
out
.println(result);
}
}
使用java.util.Random类取得随机数。
第二种实现方法:
源码:
//
冒泡排序
public
void
BubbleExchangeSort(
double
[] sorted) {
int
sortedLen = sorted.
length
;
for
(
int
j = sortedLen; j > 0; j--) {
int
end = j;
for
(
int
k = 1; k < end - 1; k++) {
double
tempB = sorted[k];
sorted[k] = sorted[k] < sorted[k + 1] ? sorted[k]
: sorted[k + 1];
if
(Math.abs
(sorted[k] - tempB) > 10e-6) {
sorted[k + 1] = tempB;
}
}
}
}
在这里,也让自己加深了对Java方法中的参数传递是值传递的认识,即传递的是地址,如果传递的是一个对象,则此对象的地址不能改变,但是这个对象中的属性是可以改变的。
就像在上面这个方法,参数传递的是sorted数组,数组中的单个值是可以改变的,这样,即使不将sorted数组作为返回值返回,得到的sorted数组其实里面的值已经改变了。
不过我个人感觉可以做以下的修改:
/*if (Math.abs(sorted[k] - tempB) > 10e-6) {
sorted[k + 1] = tempB;
}*/
if
(sorted[k]!=tempB){
sorted
[k+1]=tempB;
}
因为注释的内容我感觉是判断是否做过移动,如
45
,
23
,因为
45>23
,所以
sorted[k]
由原先的
45
变为了
23
,但是此时的
sorted[k+1]
还是
23
,所以需要把
45
赋给
sorted[k+1],
所以只要判断一下
sorted[k]
和
tempB
的值是否一致就行了,而且这样还可以避免不稳定的情况出现。
快速排序
:
通过一趟排序,将待排序记录分割成独立的两个部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个
序列有序。具体做法是:使用两个指针low,high,
初值分别设置为序列的头,和序列的尾,设置pivotkey为第一个记录,首先从high开始向前搜索第一个小于pivotkey的记录和
pivotkey所在位置进行交换,然后从low开始向后搜索第一个大于pivotkey的记录和此时pivotkey所在位置进行交换,重复知道
low=high了为止。
源码为:
package
com.zhaozy.sort;
import
java.util.Random;
/**
*
快速排序
*
*
@author
zhaozy
*
*/
public
class
QuickSort {
public
static
void
main(String[] args) {
Random random =
new
Random();
int
[] dataset =
new
int
[21];
System.
out
.print(
"
原始数据为:
"
);
//sorted[0]没有为其赋初值,值为0.0,其作用是作为临时数据存放的地方
for
(
int
i = 1; i < dataset.
length
; i++) {
dataset[i] = (
int
) (random.nextDouble() * 100);
System.
out
.print(dataset[i] +
" "
);
}
System.
out
.println();
QuickSort sort =
new
QuickSort();
sort.testQuick(dataset, 1, dataset.
length
- 1);
System.
out
.print(
"
排好序后的数据为:
"
);
for
(
int
i = 1; i < dataset.
length
; i++) {
System.
out
.print(dataset[i] +
" "
);
}
}
public
void
testQuick(
int
[] dataset,
int
low,
int
high) {
if
(low < high) {
int
pivot =
this
.findPivot(dataset, low, high);
this
.testQuick(dataset, low, pivot - 1);
this
.testQuick(dataset, pivot + 1, high);
}
}
public
int
findPivot(
int
[] dataset,
int
low,
int
high) {
dataset[0] = dataset[low];
while
(low < high) {
while
(low < high && dataset[high] >= dataset[0]) {
--high;
}
dataset[low] = dataset[high];
while
(low < high && dataset[low] <= dataset[0]) {
++low;
}
dataset[high] = dataset[low];
}
dataset[low] = dataset[0];
return
low;
}
}
在方法testQuick
中使用了递归的思想。
findPivot()
方法的另外一种实现方法:
private
static
int
partition(
int
[] array,
int
low,
int
high) {
int
s = array[high];
int
i = low - 1;
for
(
int
j = low; j < high; j++) {
if
(array[j] < s) {
i++;
swap
(array, i, j);
}
}
swap
(array, ++i, high);
return
i;
}
//
掉位方法
private
static
void
swap(
int
[] array,
int
i,
int
j) {
int
temp;
temp = array[i];
array[i] = array[j];
array[j] = temp
;
}
有点晕,没看明白方法是怎么实现的,难道是自己现在的水平有限?呵呵,先做一下标记,以后继续研究。
分享到:
相关推荐
本文主要探讨四种基本的排序算法:插入排序、交换排序、选择排序和归并排序,这些都是内部排序的主要方法。 1. **插入排序**: - 直接插入排序是最基础的排序算法之一,它的工作原理类似于人们手动整理扑克牌。...
交换排序 选择排序 冒泡排序 插入排序
交换排序之冒泡排序.cpp
本文将深入探讨两种交换排序算法——冒泡排序和快速排序的实现原理及源码分析。 **冒泡排序(Bubble Sort)** 冒泡排序是一种简单直观的排序算法,它重复地遍历待排序的列表,一次比较两个元素,如果他们的顺序...
根据给定的文件信息,我们将深入探讨几种经典的排序算法,包括选择排序、冒泡排序、交换排序、希尔排序、插入排序以及基数排序。这些算法在计算机科学领域内有着广泛的应用,各自具有独特的特点和适用场景。 ### 1....
其中包含了各种对数组排序的方法,数组下标从1开始,有插入排序(直接插入排序、希尔排序),交换排序(起泡排序、快速排序),选择排序(简单选择排序,堆排序(另外写))、归并排序(递归,非递归)。
冒泡排序是一种简单直观的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的...
本文主要介绍了五种内部排序算法:插入排序、交换排序、选择排序、归并排序和基数排序。 1. **插入排序**: 插入排序的基本思想是从未排序的序列中取出一个元素,然后将其插入到已排序序列的正确位置,以保持序列...
排序算法(插入排序、交换排序、选择排序、归并排序、基数排序)
### 数据结构:交换排序-冒泡排序实验指导 #### 实验背景与目标 在计算机科学领域,数据结构和算法是核心研究对象,其中排序算法作为基础且重要的算法之一,广泛应用于各类数据处理场景。本实验旨在深入理解并掌握...
现代交换原理 排序 动画演示 现代交换原理 排序 动画演示 排序 动画演示
数组下标从0开始的排序,其中包含了各种对数组排序的方法,有插入排序(直接插入排序、希尔排序),交换排序(起泡排序、快速排序),选择排序(简单选择排序,堆排序(另外写))、归并排序(递归,非递归)。
交换排序是一个更广泛的术语,它包括了所有通过交换元素来实现排序的算法,而冒泡排序是其中最简单且最直观的一种。虽然冒泡排序的时间复杂度在最坏情况下是O(n²),但其优点在于实现简单,适用于小规模或者部分有序...
java 编程实现交换排序 public class jiaohuanpx{ public static void main(String[] args){ int i,j,t; int a[]=new int[]{8,9,3,2,4,6,7,5,10,1,11,54,78,22}; for(i=0;i;i++) System.out.print(a[i]+" "); ...
### 希尔排序法(希尔插入排序,希尔交换排序) #### 一、希尔排序法简介 希尔排序法是计算机科学领域中一种重要的排序算法,它由美国计算机科学家Donald Shell于1959年提出,因此得名希尔排序。希尔排序是一种...
交换法排序,也被称为冒泡排序、选择排序或简单交换排序,它的基本思想是通过不断交换相邻的不正确顺序元素来逐步调整数组。 **交换法排序的原理:** 交换法排序是一种基于比较的排序算法,它通过比较数组中的元素...
交换排序是一种常见的排序算法,它通过不断地交换元素来达到排序的目的。本文将深入探讨交换排序算法,特别是C/C++语言中的实现方式。 交换排序的核心思想是通过比较数组中的相邻元素,如果它们的顺序错误,就交换...
交换排序.cpp交换排序.cpp
**冒泡排序** 是最基础的交换排序之一,其名字来源于排序过程中元素像气泡一样逐渐上升到顶部。冒泡排序的工作原理是反复遍历待排序的序列,每次比较相邻两个元素,如果它们的顺序错误(即前者大于后者),就交换这...