package test;import java.sql.SQLException;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;public class Test {
private static Log log = LogFactory.getLog(Test.class); /**
* @param args
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
int[] arr1 = new int[]{45,6,45,457,345,3,45,34,6,7,6,7,436,86,346,634,23,4,23};
show1(arr1);
System.out.println();
int[] arr2 = new int[]{45,6,45,457,345,3,45,34,6,7,6,7,436,86,346,634,23,4,23};
show2(arr2);
}
public static void show1(int[] arr){
int count1 = 0;
int count2 = 0;
for(int i = 0;i < arr.length-1;i++){
for(int j = 0;j<arr.length-i-1;j++){
++count1;
if(arr[j]>arr[j+1]){
++count2;
arr[j] = arr[j] + arr[j+1];
arr[j+1] = arr[j] - arr[j+1];
arr[j] = arr[j] - arr[j+1];
}
}
}
System.out.println(count1);
System.out.println(count2);
for(int k = 0;k<arr.length;k++){
System.out.print(arr[k]+"\t");
}
}
public static void show2(int[] arr){
int count1 = 0;
int count2 = 0;
for(int i = 0;i < arr.length;i++){
for(int j = i+1;j<arr.length;j++){
++count1;
if(arr[i]>arr[j]){
++count2;
arr[i] = arr[i] + arr[j];
arr[j] = arr[i] - arr[j];
arr[i] = arr[i] - arr[j];
}
}
}
System.out.println(count1);
System.out.println(count2);
for(int k = 0;k<arr.length;k++){
System.out.print(arr[k]+"\t");
}
}}第一个是学校教的,第二个是我自己想的(忘了,不知道是自己想的还是在哪里看的反正一直用的是第二个)
我测试的是第二个交换次数少。结果:
从小到大
171
81
3 4 6 6 6 7 7 23 23 34 45 45 45 86 345 346 436 457 634
171
61
3 4 6 6 6 7 7 23 23 34 45 45 45 86 345 346 436 457 634 从大到小
171
82
634 457 436 346 345 86 45 45 45 34 23 23 7 7 6 6 6 4 3
171
51
634 457 436 346 345 86 45 45 45 34 23 23 7 7 6 6 6 4 3
解决方案 »
- java中null,true,false各占几个字节,在底层分别如何用二进制形式表示
- Process类中的getOutputStream()是干嘛用的
- 用java 文件下载的时候会弹出两个框,一个是打开,一个是另存
- 小白求解??希望大家给于帮助!
- 急!文本框中输入的字体很难看
- 在java里面怎么读取text字段 ??请高手指点指点
- 这段程序编译为什么有错误,请指点
- 请问:如何得到本机的操作系统版本,ie版本,等机器配置数据???
- 请问Tomcat4.04的http://localhost:8080/manager的用户名和口令是多少?
- JAVA APPLET不能运行
- 正则表达式问题
- 求关于一内部类的运行结果,并请说下简单的理由。
只是实现方式不太一样而已
我这里也给个冒泡的
不过在排序的过程中有些优化
特别的是当一个数组已经排好的话 时间复杂度就是 o(n)的了public static void bubbleSort(int... arr) {
int temp;
for (int i = 0; i < arr.length - 1; i++) {
temp = 0;
for (int j = arr.length - 1; j > i; j--) {
if (arr[j] < arr[j - 1]) {
arr[j] ^= arr[j - 1];
arr[j - 1] ^= arr[j];
arr[j] ^= arr[j - 1];
temp++;
}
}
if(temp == 0){
break;
}
}
}
arr[j+1] = arr[j] - arr[j+1];
arr[j] = arr[j] - arr[j+1];这样交换是不正确的!
/**
* 冒泡排序
*/
public void BubbleUp(){
long save;
for (int i = 0; i < elems; i++) {
for (int j = elems-1; j > i; j--) {
if(a[j] > a[j-1]){
save = a[j];
a[j] = a[j-1];
a[j-1] = save;
}
}
}
display();
}
/**
* 选择排序
*/
public void selectionSort(){
int out,in,min;
long save;
for (out = 0; out < elems-1; out++) {
min = out;
for (in = out+1; inif(a[in] < a[min])
min = in;
}
save = a[out];
a[out] = a[min];
a[min] = save;
}
display();
}
/**
* 插入算法
*/
public void insertAlgorithm(){
int in,out;
for (out = 0; out < elems; out++) {
long temp = a[out];
in = out;
while(in > 0 && a[in-1] <= temp){
a[in] = a[in-1];
--in;
}
a[in] = temp;
}
display();
}
归并和快排是比较快
但归并比较浪费空间
对于一个有序的数组来说
插入和冒泡都是O(n)的时间复杂度
相反 快排却退化到了O(n^2)的时间复杂度
但常规下还是快排比较好吧
下边是5种常规排序,楼主可以看看
个人写的可能不好
有什么建议的话希望能给以提示// 递增
public static void bubbleSort(int... arr) {
int temp;
for (int i = 0; i < arr.length - 1; i++) {
temp = 0;
for (int j = arr.length - 1; j > i; j--) {
if (arr[j] < arr[j - 1]) {
arr[j] ^= arr[j - 1];
arr[j - 1] ^= arr[j];
arr[j] ^= arr[j - 1];
temp++;
}
}
if(temp == 0){
break;
}
}
} public static void selectSort(int... arr) {
int temp;
for (int i = 0; i < arr.length - 1; i++) {
temp = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[temp]) {
temp = j;
}
}
if (temp == i)
continue;
arr[i] ^= arr[temp];
arr[temp] ^= arr[i];
arr[i] ^= arr[temp];
}
} public static void quickSort(int[] arr) {
innerQuickSort(arr, 0, arr.length - 1);
} private static void innerQuickSort(int[] arr, int head, int end) {
if (head >= end) {
return;
}
int index = head;
int temp = 0;
for (int i = head; i < end; i++) {
if (arr[i] <= arr[end]) {
temp = arr[index];
arr[index] = arr[i];
arr[i] = temp;
index++;
}
}
temp = arr[index];
arr[index] = arr[end];
arr[end] = temp;
innerQuickSort(arr, head, index - 1);
innerQuickSort(arr, index + 1, end);
}
public static void insertSort(int... arr)
{
int index, temp;
for(int i = 1; i < arr.length; i++)
{
index = i;
temp = arr[i];
while(index-- > 0 && arr[index] > temp);
for(int j = i; j > index + 1; j--)
{
arr[j] = arr[j - 1];
}
arr[index + 1] = temp;
}
} public static void mergeSort(int... arr)
{
if(arr.length > 1)
{
int len1 = arr.length / 2;
int len2 = arr.length - len1;
int arr1[] = new int[len1];
int arr2[] = new int[len2];
for(int i = 0; i < len1; i++)
{
arr1[i] = arr[i];
}
for(int j = 0; j < len2; j++)
{
arr2[j] = arr[len1 + j];
}
mergeSort(arr1);
mergeSort(arr2);
int index1 = 0;
int index2 = 0;
int index = 0;
while(index1 < len1 && index2 < len2)
{
if(arr1[index1] < arr2[index2])
{
arr[index++] = arr1[index1++];
}
else
{
arr[index++] = arr2[index2++];
}
}
while(index1 < len1)
{
arr[index++] = arr1[index1++];
}
while(index2 < len2)
{
arr[index++] = arr2[index2++];
}
}
}
int a, b;
a = 100, b = 1000;
a ^= b ^= a ^= b;int a, b;
a = 100, b = 1000;
a += b -= a += b;