Ⅰ java编程实现随机数组的快速排序
java编程实现随机数组的快速排序步骤如下:
1、打开Eclipse,新建一个Java工程,在此工程里新建一拍模个Java类;
2、在新建的类中声明一个产生随机数的Random变量,再声明一个10个长度的int型数组;
3、将产生的随机数逐个放入到数组中;
4、利用排序算法对随机数组进行排序。
具体代码如下:
importjava.util.Random;
publicclassDemo{
publicstaticvoidmain(String[]args){
intcount=0;
Randomrandom=newRandom();
inta[]袭芦缓=newint[10];
while(count<10){
a[count]=random.nextInt(1000);//产生0-999的随机数
count++;
}
for(inti=0;i<a.length-1;i++){
intmin=i;
for(intj=哗宽i+1;j<a.length;j++){
if(a[j]<a[min]){
min=j;
}
}
if(min!=i){
intb=a[min];
a[min]=a[i];
a[i]=b;
}
}
for(intc=0;c<a.length;c++){
System.out.print(a[c]+"");
}
}
}
Ⅱ java快速排序简单代码
.example-btn{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.example-btn:hover{color:#fff;background-color:#47a447;border-color:#398439}.example-btn:active{background-image:none}div.example{width:98%;color:#000;background-color:#f6f4f0;background-color:#d0e69c;background-color:#dcecb5;background-color:#e5eecc;margin:0 0 5px 0;padding:5px;border:1px solid #d4d4d4;background-image:-webkit-linear-gradient(#fff,#e5eecc 100px);background-image:linear-gradient(#fff,#e5eecc 100px)}div.example_code{line-height:1.4em;width:98%;background-color:#fff;padding:5px;border:1px solid #d4d4d4;font-size:110%;font-family:Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;word-break:break-all;word-wrap:break-word}div.example_result{background-color:#fff;padding:4px;border:1px solid #d4d4d4;width:98%}div.code{width:98%;border:1px solid #d4d4d4;background-color:#f6f4f0;color:#444;padding:5px;margin:0}div.code div{font-size:110%}div.code div,div.code p,div.example_code p{font-family:"courier new"}pre{margin:15px auto;font:12px/20px Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;border:1px solid #ddd;border-left-width:4px;padding:10px 15px} 排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。以下是快速排序算法:
快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏誉渣宏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序梁灶通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。
快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒庆册泡排序基础上的递归分治法。
快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高!它是处理大数据最快的排序算法之一了。虽然 Worst Case 的时间复杂度达到了 O(n?),但是人家就是优秀,在大多数情况下都比平均时间复杂度为 O(n logn) 的排序算法表现要更好,可是这是为什么呢,我也不知道。好在我的强迫症又犯了,查了 N 多资料终于在《算法艺术与信息学竞赛》上找到了满意的答案:
快速排序的最坏运行情况是 O(n?),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。
1. 算法步骤
从数列中挑出一个元素,称为 "基准"(pivot);
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
2. 动图演示
代码实现 JavaScript 实例 function quickSort ( arr , left , right ) {
var len = arr. length ,
partitionIndex ,
left = typeof left != 'number' ? 0 : left ,
right = typeof right != 'number' ? len - 1 : right ;
if ( left
Ⅲ Java快速排序
原理:
快速排序也是分治法思想的一种实现,他的思路是使数组中的每个元素与基准值(Pivot,通常是数组的首个值,A[0])比较,数组中比基准值小的放在基准值的左边,形成左部;大的放在右边,形成右部;接下来将左部和右部分别递归地执行上面的过程:选基准值,小的放在左边,大的放在右边。。。直到排序结束。
步骤:
1.找基准值,设Pivot = a[0]
2.分区(Partition):比基准值小的放左边,大的放右边,基准值(Pivot)放左部与右部的之间。
3.进行左部(a[0] - a[pivot-1])的递归,以及右部(a[pivot+1] - a[n-1])的递归,重复上述步骤
Ⅳ 如何用JAVA实现快速排序算法
本人绝郑特地给你让宏握编的坦庆代码x0dx0a亲测{(inta[],intp,intr){x0dx0aintx=a[r-1];x0dx0ainti=p-1;x0dx0ainttemp;x0dx0afor(intj=p;j<=r-1;j++){x0dx0aif(a[j-1]<=x){x0dx0a//swap(a[j-1],a[i-1]);x0dx0ai++;x0dx0atemp=a[j-1];x0dx0aa[j-1]=a[i-1];x0dx0aa[i-1]=temp;x0dx0ax0dx0a}x0dx0a}x0dx0a//swap(a[r-1,a[i+1-1]);x0dx0atemp=a[r-1];x0dx0aa[r-1]=a[i+1-1];x0dx0aa[i+1-1]=temp;x0dx0ax0dx0areturni+1;x0dx0ax0dx0a}x0dx0ax0dx0apublicstaticvoidQuickSort(inta[],intp,intr){x0dx0ax0dx0aif(p Ⅳ 常见的排序算法—选择,冒泡,插入,快速,归并 太久没看代码了,最近打算复习一下java,又突然想到了排序算法,就把几种常见的排序算法用java敲了一遍,这里统一将无序的序列从小到大排列。 选择排序是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小元素,继续放在下一个位置,直到待排序元素个数为0。 选择排序代码如下: public void Select_sort(int[] arr) { int temp,index; for( int i=0;i<10;i++) { index = i; for(int j = i + 1 ; j < 10 ; j++) { if(arr[j] < arr[index]) index = j; } /* temp = arr[i]; arr[i] = arr[index]; arr[index] = temp; */ swap(arr,i,index); } System.out.print("经过选择排序后:"); for(int i = 0 ; i < 10 ; i++) System.out.print( arr[i] +" "); System.out.println(""); } 冒泡排序是一种比较基础的排序算法,其思想是相邻的元素两两比较,较大的元素放后面,较小的元素放前面,这样一次循环下来,最大元素就会归位,若数组中元素个数为n,则经过(n-1)次后,所有元素就依次从小到大排好序了。整个过程如同气泡冒起,因此被称作冒泡排序。 选择排序代码如下: public void Bubble_sort(int[] arr) { int temp; for(int i = 0 ; i < 9 ; i++) { for(int j = 0 ; j < 10 - i - 1 ;j++) { if(arr[j] > arr[j+1]) { /* temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; */ swap(arr,j,j+1); } } } System.out.print("经过冒泡排序后:"); for(int i = 0 ; i < 10 ; i++) System.out.print( arr[i] +" "); System.out.println(""); } 插入排序也是一种常见的排序算法,插入排序的思想是:创建一个与待排序数组等大的数组,每次取出一个待排序数组中的元素,然后将其插入到新数组中合适的位置,使新数组中的元素保持从小到大的顺序。 插入排序代码如下: public void Insert_sort(int[] arr) { int length = arr.length; int[] arr_sort = new int[length]; int count = 0; for(int i = 0;i < length; i++) { if(count == 0) { arr_sort[0] = arr[0]; }else if(arr[i] >= arr_sort[count - 1]) { arr_sort[count] = arr[i]; }else if(arr[i] < arr_sort[0]) { insert(arr,arr_sort,arr[i],0,count); }else { for(int j = 0;j < count - 1; j++) { if(arr[i] >= arr_sort[j] && arr[i] < arr_sort[j+1]) { insert(arr,arr_sort,arr[i],j+1,count); break; } } } count++; } System.out.print("经过插入排序后:"); for(int i = 0 ; i < 10 ; i++) System.out.print( arr_sort[i] +" "); System.out.println(""); } public void insert(int[] arr,int[] arr_sort,int value,int index,int count) { for(int i = count; i > index; i--) arr_sort[i] = arr_sort[i-1]; arr_sort[index] = value; } 快速排序的效率比冒泡排序算法有大幅提升。因为使用冒泡排序时,一次外循环只能归位一个值,有n个元素最多就要执行(n-1)次外循环。而使用快速排序时,一次可以将所有元素按大小分成两堆,也就是平均情况下需要logn轮就可以完成排序。 快速排序的思想是:每趟排序时选出一个基准值(这里以首元素为基准值),然后将所有元素与该基准值比较,并按大小分成左右两堆,然后递归执行该过程,直到所有元素都完成排序。 public void Quick_sort(int[] arr, int left, int right) { if(left >= right) return ; int temp,t; int j = right; int i = left; temp = arr[left]; while(i < j) { while(arr[j] >= temp && i < j) j--; while(arr[i] <= temp && i < j) i++; if(i < j) { t = arr[i]; arr[i] = arr[j]; arr[j] = t; } } arr[left] = arr[i]; arr[i] = temp; Quick_sort(arr,left, i - 1); Quick_sort(arr, i + 1, right); } 归并排序是建立在归并操作上的一种有效的排序算法,归并排序对序列的元素进行逐层折半分组,然后从最小分组开始比较排序,每两个小分组合并成一个大的分组,逐层进行,最终所有的元素都是有序的。 public void Mergesort(int[] arr,int left,int right) { if(right - left > 0) { int[] arr_1 = new int[(right - left)/2 + 1]; int[] arr_2 = new int[(right - left + 1)/2]; int j = 0; int k = 0; for(int i = left;i <= right;i++) { if(i <= (right + left)/2) { arr_1[j++] = arr[i]; }else { arr_2[k++] = arr[i]; } } Mergesort(arr_1,0,(right - left)/2); Mergesort(arr_2,0,(right - left - 1)/2); Merge(arr_1,arr_2,arr); } } public void Merge(int[] arr_1,int[] arr_2,int[] arr) { int i = 0; int j = 0; int k = 0; int L1 = arr_1.length; int L2 = arr_2.length; while(i < L1 && j < L2) { if(arr_1[i] <= arr_2[j]) { arr[k] = arr_1[i]; i++; }else { arr[k] = arr_2[j]; j++; } k++; } if(i == L1) { for(int t = j;j < L2;j++) arr[k++] = arr_2[j]; }else { for(int t = i;i < L1;i++) arr[k++] = arr_1[i]; } } 归并排序这里我使用了left,right等变量,使其可以通用,并没有直接用数字表示那么明确,所以给出相关伪代码,便于理解。 Mergesort(arr[0...n-1]) //输入:一个可排序数组arr[0...n-1] //输出:非降序排列的数组arr[0...n-1] if n>1 arr[0...n/2-1] to arr_1[0...(n+1)/2-1]//确保arr_1中元素个数>=arr_2中元素个数 //对于总个数为奇数时,arr_1比arr_2中元素多一个;对于总个数为偶数时,没有影响 arr[n/2...n-1] to arr_2[0...n/2-1] Mergesort(arr_1[0...(n+1)/2-1]) Mergesort(arr_2[0...n/2-1]) Merge(arr_1,arr_2,arr) Merge(arr_1[0...p-1],arr_2[0...q-1],arr[0...p+q-1]) //输入:两个有序数组arr_1[0...p-1]和arr_2[0...q-1] //输出:将arr_1与arr_2两数组合并到arr int i<-0;j<-0;k<-0 while i if arr_1[i] <= arr_2[j] arr[k] <- arr_1[i] i<-i+1 else arr[k] <- arr_2[j];j<-j+1 k<-k+1 if i=p arr_2[j...q-1] to arr[k...p+q-1] else arr_1[i...p-1] to arr[k...p+q-1] package test_1; import java.util.Scanner; public class Test01 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int[] arr_1 = new int[10]; for(int i = 0 ; i < 10 ; i++) arr_1[i] = sc.nextInt(); Sort demo_1 = new Sort(); //1~5一次只能运行一个,若多个同时运行,则只有第一个有效,后面几个是无效排序。因为第一个运行的已经将带排序数组排好序。 demo_1.Select_sort(arr_1);//-----------------------1 //demo_1.Bubble_sort(arr_1);//---------------------2 /* //---------------------3 demo_1.Quick_sort(arr_1, 0 , arr_1.length - 1); System.out.print("经过快速排序后:"); for(int i = 0 ; i < 10 ; i++) System.out.print( arr_1[i] +" "); System.out.println(""); */ //demo_1.Insert_sort(arr_1);//--------------------4 /* //--------------------5 demo_1.Mergesort(arr_1,0,arr_1.length - 1); System.out.print("经过归并排序后:"); for(int i = 0 ; i < 10 ; i++) System.out.print( arr_1[i] +" "); System.out.println(""); */ } } class Sort { public void swap(int arr[],int a, int b) { int t; t = arr[a]; arr[a] = arr[b]; arr[b] = t; } public void Select_sort(int[] arr) { int temp,index; for( int i=0;i<10;i++) { index = i; for(int j = i + 1 ; j < 10 ; j++) { if(arr[j] < arr[index]) index = j; } /* temp = arr[i]; arr[i] = arr[index]; arr[index] = temp; */ swap(arr,i,index); } System.out.print("经过选择排序后:"); for(int i = 0 ; i < 10 ; i++) System.out.print( arr[i] +" "); System.out.println(""); } public void Bubble_sort(int[] arr) { int temp; for(int i = 0 ; i < 9 ; i++) { for(int j = 0 ; j < 10 - i - 1 ;j++) { if(arr[j] > arr[j+1]) { /* temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; */ swap(arr,j,j+1); } } } System.out.print("经过冒泡排序后:"); for(int i = 0 ; i < 10 ; i++) System.out.print( arr[i] +" "); System.out.println(""); } public void Quick_sort(int[] arr, int left, int right) { if(left >= right) return ; int temp,t; int j = right; int i = left; temp = arr[left]; while(i < j) { while(arr[j] >= temp && i < j) j--; while(arr[i] <= temp && i < j) i++; if(i < j) { t = arr[i]; arr[i] = arr[j]; arr[j] = t; } } arr[left] = arr[i]; arr[i] = temp; Quick_sort(arr,left, i - 1); Quick_sort(arr, i + 1, right); } public void Insert_sort(int[] arr) { int length = arr.length; int[] arr_sort = new int[length]; int count = 0; for(int i = 0;i < length; i++) { if(count == 0) { arr_sort[0] = arr[0]; }else if(arr[i] >= arr_sort[count - 1]) { arr_sort[count] = arr[i]; }else if(arr[i] < arr_sort[0]) { insert(arr,arr_sort,arr[i],0,count); }else { for(int j = 0;j < count - 1; j++) { if(arr[i] >= arr_sort[j] && arr[i] < arr_sort[j+1]) { insert(arr,arr_sort,arr[i],j+1,count); break; } } } count++; } System.out.print("经过插入排序后:"); for(int i = 0 ; i < 10 ; i++) System.out.print( arr_sort[i] +" "); System.out.println(""); } public void insert(int[] arr,int[] arr_sort,int value,int index,int count) { for(int i = count; i > index; i--) arr_sort[i] = arr_sort[i-1]; arr_sort[index] = value; } public void Mergesort(int[] arr,int left,int right) { if(right - left > 0) { int[] arr_1 = new int[(right - left)/2 + 1]; int[] arr_2 = new int[(right - left + 1)/2]; int j = 0; int k = 0; for(int i = left;i <= right;i++) { if(i <= (right + left)/2) { arr_1[j++] = arr[i]; }else { arr_2[k++] = arr[i]; } } Mergesort(arr_1,0,(right - left)/2); Mergesort(arr_2,0,(right - left - 1)/2); Merge(arr_1,arr_2,arr); } } public void Merge(int[] arr_1,int[] arr_2,int[] arr) { int i = 0; int j = 0; int k = 0; int L1 = arr_1.length; int L2 = arr_2.length; while(i < L1 && j < L2) { if(arr_1[i] <= arr_2[j]) { arr[k] = arr_1[i]; i++; }else { arr[k] = arr_2[j]; j++; } k++; } if(i == L1) { for(int t = j;j < L2;j++) arr[k++] = arr_2[j]; }else { for(int t = i;i < L1;i++) arr[k++] = arr_1[i]; } } } 若有错误,麻烦指正,不胜感激。 Ⅵ 如何用java实现快速排序,简答讲解下原理
快速排序思想: Ⅶ 请问一下java快速排序源代码
是字母还是数字?? Ⅷ java中排序方法有哪些
具体要看你是做什么样的排序,如果是集合排序,比如list的排序,可以使用楼上说的collections类的里静态方法,如果你要对数组进行排序,可以自己写排序算法,也可以直接使用java提供的arrays.sort方法,但要注意,如果数组里的元素都是对象,那么要求这些对象都要实现了comparable接口,包括list也是。
通过对数据元素集合Rn 进行一趟排序划分出独立的两个部分。其中一个部分的关键字比另一部分的关键字小。然后再分别对两个部分的关键字进行一趟排序,直到独立的元素只有一个,此时整个元素集合有序。
快速排序的过程,对一个元素集合R[ low ... high ] ,首先取一个数(一般是R[low] )做参照 , 以R[low]为基准重新排列所有的元素。
所有比R[low]小的放前面,所有比R[low] 大的放后面,然后以R[low]为分界,对R[low ... high] 划分为两个子集和,再做划分。直到low >= high 。
比如:对R={37, 40, 38, 42, 461, 5, 7, 9, 12}进行一趟快速排序的过程如下(注:下面描述的内容中元素下表从 0 开始):
开始选取基准 base = 37,初始位置下表 low = 0 , high = 8 , 从high=8,开始如果R[8] < base , 将high位置中的内容写入到R[low]中, 将high位置空出来, low = low +1 ;
从low开始探测,由于low=1 , R[low] > base ,所以将R[low]写入到R[high] , high = high -1 ;
检测到low < high ,所以第一趟快速排序仍需继续:
此时low=1,high=7,因为 R[high] < base ,所以将 R[high] 写入到到R[low]中,low = low + 1;
从low开始探测,low = 2 , R[low] >base ,所以讲R[low]写入到R[high],high=high-1;
继续检测到 low 小于high
此时low=2,high=6,同理R[high] < base ,将R[high] 写入到R[low]中,low=low+1;
从low继续探测,low = 3 , high=6 , R[low] > base , 将R[low]写入到R[high]中,high = high-1;
继续探测到low小于high
此时low=3,high=5,同理R[high] < base,将R[high]写入到R[low]中,low = low +1;
从low继续探测,low = 4,high=5,由于R[low] > base , 将R[low]写入到R[high]中,high = high -1 ;
此时探测到low == high == 4 ;该位置即是base所在的位置,将base写入到该位置中.
然后再对子序列Rs1 = {12,9,7,5} 和 Rs2={461,42,38,40}做一趟快速排序,直到Rsi中只有一个元素,或没有元素。
快速排序的Java实现:
private static boolean isEmpty(int[] n) {
return n == null || n.length == 0;
}
// ///////////////////////////////////////////////////
/**
* 快速排序算法思想——挖坑填数方法:
*
* @param n 待排序的数组
*/
public static void quickSort(int[] n) {
if (isEmpty(n))
return;
quickSort(n, 0, n.length - 1);
}
public static void quickSort(int[] n, int l, int h) {
if (isEmpty(n))
return;
if (l < h) {
int pivot = partion(n, l, h);
quickSort(n, l, pivot - 1);
quickSort(n, pivot + 1, h);
}
}
private static int partion(int[] n, int start, int end) {
int tmp = n[start];
while (start < end) {
while (n[end] >= tmp && start < end)
end--;
if (start < end) {
n[start++] = n[end];
}
while (n[start] < tmp && start < end)
start++;
if (start < end) {
n[end--] = n[start];
}
}
n[start] = tmp;
return start;
}
在代码中有这样一个函数:
public static void quickSortSwap(int[] n, int l, int h)
该函数可以实现,元素集合中特定的 l 到 h 位置间的数据元素进行排序。
package com.icescut.classic.algorithm;
public class BubbleSort {
public static void main(String[] args) {
int[] array = {10,-3,5,34,-34,5,0,9}; //test data
sort(array);
for(int el : array) {
System.out.print(el + " ");
}
}
static void sort(int[] array) {
int length = array.length;
int temp;
boolean isSort;
for(int i = 1; i < length; i++) {
isSort = false;
for(int j = 0; j < length - i; j++) {
if(array[j] > array[j+1]) {
//交换
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
isSort = true;
}
}
if(!isSort) break; //如果没有发生交换,则退出循环
}
}
}