JAVA常考三种排序(选择 冒泡 插入)
java的几种排序方式
java的几种排序方式用Java语言实现的各种排序,包括插入排序、冒泡排序、选择排序、Shell排序、快速排序、归并排序、堆排序、SortUtil等。
插入排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class InsertSort implements SortUtil.Sort{/* (non-Javadoc)* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])*/public void sort(int[] data) {int temp;for(int i=1;i for(int j=i;(j>0)&&(data[j] SortUtil.swap(data,j,j-1);}}}}冒泡排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class BubbleSort implements SortUtil.Sort{/* (non-Javadoc)* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])*/public void sort(int[] data) {int temp;for(int i=0;i for(int j=data.length-1;j>i;j--){if(data[j] SortUtil.swap(data,j,j-1);}}}}}选择排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class SelectionSort implements SortUtil.Sort { /** (non-Javadoc)** @see org.rut.util.algorithm.SortUtil.Sort#sort(int[]) */public void sort(int[] data) {int temp;for (int i = 0; i < data.length; i++) {int lowIndex = i;for (int j = data.length - 1; j >i; j--) {if (data[j] < data[lowIndex]) {lowIndex = j;}}SortUtil.swap(data,i,lowIndex);}}}Shell排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class ShellSort implements SortUtil.Sort{/* (non-Javadoc)* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[]) */public void sort(int[] data) {for(int i=data.length/2;i>2;i/=2){for(int j=0;j insertSort(data,j,i);}}insertSort(data,0,1);/*** @param data* @param j* @param i*/private void insertSort(int[] data, int start, int inc) {int temp;for(int i=start+inc;i for(int j=i;(j>=inc)&&(data[j] SortUtil.swap(data,j,j-inc); }}}}快速排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class QuickSort implements SortUtil.Sort{/* (non-Javadoc)* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])*/public void sort(int[] data) {quickSort(data,0,data.length-1);}private void quickSort(int[] data,int i,int j){int pivotIndex=(i+j)/2;//swapSortUtil.swap(data,pivotIndex,j);int k=partition(data,i-1,j,data[j]);SortUtil.swap(data,k,j);if((k-i)>1) quickSort(data,i,k-1);if((j-k)>1) quickSort(data,k+1,j);}/*** @param data* @param i* @param j* @return*/private int partition(int[] data, int l, int r,int pivot) {while(data[++l] while((r!=0)&&data[--r]>pivot);SortUtil.swap(data,l,r);}while(l SortUtil.swap(data,l,r);return l;}}改进后的快速排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class ImprovedQuickSort implements SortUtil.Sort { private static int MAX_STACK_SIZE=4096;private static int THRESHOLD=10;/* (non-Javadoc)* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[]) */public void sort(int[] data) {int[] stack=new int[MAX_STACK_SIZE];int top=-1;int pivot;int pivotIndex,l,r;stack[++top]=0;stack[++top]=data.length-1;while(top>0){int j=stack[top--];int i=stack[top--];pivotIndex=(i+j)/2;pivot=data[pivotIndex];SortUtil.swap(data,pivotIndex,j);//partitionl=i-1;r=j;do{while(data[++l] while((r!=0)&&(data[--r]>pivot)); SortUtil.swap(data,l,r);}while(l SortUtil.swap(data,l,r);SortUtil.swap(data,l,j);if((l-i)>THRESHOLD){stack[++top]=i;stack[++top]=l-1;}if((j-l)>THRESHOLD){stack[++top]=l+1;stack[++top]=j;}}//new InsertSort().sort(data);insertSort(data);}/*** @param data*/private void insertSort(int[] data) {int temp;for(int i=1;i for(int j=i;(j>0)&&(data[j] SortUtil.swap(data,j,j-1); }}}}归并排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class MergeSort implements SortUtil.Sort{/* (non-Javadoc)* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])*/public void sort(int[] data) {int[] temp=new int[data.length];mergeSort(data,temp,0,data.length-1);}private void mergeSort(int[] data,int[] temp,int l,int r){int mid=(l+r)/2;if(l==r) return ;mergeSort(data,temp,l,mid);mergeSort(data,temp,mid+1,r);for(int i=l;i<=r;i++){temp=data;}int i1=l;int i2=mid+1;for(int cur=l;cur<=r;cur++){if(i1==mid+1)data[cur]=temp[i2++];else if(i2>r)data[cur]=temp[i1++];else if(temp[i1] data[cur]=temp[i1++];elsedata[cur]=temp[i2++];}}}改进后的归并排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class ImprovedMergeSort implements SortUtil.Sort { private static final int THRESHOLD = 10;/** (non-Javadoc)** @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])*/public void sort(int[] data) {int[] temp=new int[data.length];mergeSort(data,temp,0,data.length-1);}private void mergeSort(int[] data, int[] temp, int l, int r) { int i, j, k;int mid = (l + r) / 2;if (l == r)return;if ((mid - l) >= THRESHOLD)mergeSort(data, temp, l, mid);elseinsertSort(data, l, mid - l + 1);if ((r - mid) >THRESHOLD)mergeSort(data, temp, mid + 1, r);elseinsertSort(data, mid + 1, r - mid);for (i = l; i <= mid; i++) {temp = data;}for (j = 1; j <= r - mid; j++) {temp[r - j + 1] = data[j + mid];}int a = temp[l];int b = temp[r];for (i = l, j = r, k = l; k <= r; k++) {if (a < b) {data[k] = temp;a = temp;} else {data[k] = temp[j--];b = temp[j];}}}/*** @param data* @param l* @param i*/private void insertSort(int[] data, int start, int len) {for(int i=start+1;i for(int j=i;(j>start) && data[j] SortUtil.swap(data,j,j-1); }}}}堆排序:package org.rut.util.algorithm.support;import org.rut.util.algorithm.SortUtil;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class HeapSort implements SortUtil.Sort{/* (non-Javadoc)* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])public void sort(int[] data) {MaxHeap h=new MaxHeap();h.init(data);for(int i=0;i h.remove();System.arraycopy(h.queue,1,data,0,data.length); }private static class MaxHeap{void init(int[] data){this.queue=new int[data.length+1];for(int i=0;i queue[++size]=data;fixUp(size);}}private int size=0;private int[] queue;public int get() {return queue[1];}public void remove() {SortUtil.swap(queue,1,size--);fixDown(1);}//fixdownprivate void fixDown(int k) {int j;while ((j = k << 1) <= size) {if (j < size && queue[j] j++;if (queue[k]>queue[j]) //不用交换break;SortUtil.swap(queue,j,k);k = j;}}private void fixUp(int k) {while (k >1) {int j = k >>1;if (queue[j]>queue[k])break;SortUtil.swap(queue,j,k);k = j;}}}SortUtil:package org.rut.util.algorithm;import org.rut.util.algorithm.support.BubbleSort;import org.rut.util.algorithm.support.HeapSort;import org.rut.util.algorithm.support.ImprovedMergeSort;import org.rut.util.algorithm.support.ImprovedQuickSort;import org.rut.util.algorithm.support.InsertSort;import org.rut.util.algorithm.support.MergeSort;import org.rut.util.algorithm.support.QuickSort;import org.rut.util.algorithm.support.SelectionSort;import org.rut.util.algorithm.support.ShellSort;/*** @author treeroot* @since 2006-2-2* @version 1.0*/public class SortUtil {public final static int INSERT = 1;public final static int BUBBLE = 2;public final static int SELECTION = 3;public final static int SHELL = 4;public final static int QUICK = 5;public final static int IMPROVED_QUICK = 6;public final static int MERGE = 7;public final static int IMPROVED_MERGE = 8;public final static int HEAP = 9;public static void sort(int[] data) {sort(data, IMPROVED_QUICK);}private static String[] name={"insert", "bubble", "selection", "shell", "quick", "improved_quick", "merge", "improved_merge", "heap"};private static Sort[] impl=new Sort[]{new InsertSort(),new BubbleSort(),new SelectionSort(),new ShellSort(),new QuickSort(),new ImprovedQuickSort(),new MergeSort(),new ImprovedMergeSort(),new HeapSort()public static String toString(int algorithm){return name[algorithm-1];}public static void sort(int[] data, int algorithm) { impl[algorithm-1].sort(data);}public static interface Sort {public void sort(int[] data);}public static void swap(int[] data, int i, int j) { int temp = data;data = data[j];data[j] = temp;}}。
Java实现冒泡排序
Java实现冒泡排序问题描述利⽤冒泡排序把⼀列数组按从⼩到⼤或从⼤到⼩排序(⼀)、冒泡排序思想以从⼩到⼤为例:1、第⼀轮的冒泡,从第⼀个数开始,与相邻的第⼆个数相⽐,若第⼀个数更⼤,则交换⼀⼆的位置,反之不动,结束后进⾏⼆三位置两个数的⽐较,同理如此反复,直到把最⼤的⼀个数排到最后⼀个位置。
2、进⾏第⼆轮的冒泡,依旧从第⼀个数开始,依次⽐较当前的⼀⼆、⼆三······位置的数,直到把第⼆⼤的数排到倒数第⼆位。
3、如此循环进⾏,直到所有数按从⼩到⼤排列。
(⼆)、问题分析1.输⼊数组根据⽤户输⼊的进⾏排序的数字数量n,建⽴⼀个长度为n的数组public static void main (String[] args){int n,m;Scanner sc = new Scanner(System.in);System.out.println("请输⼊你想排序的数量n");n=sc.nextInt();int [] arrary = new int[n];System.out.println("请输⼊"+n+"个数,并⽤空格隔开");for(int i=0;i<arrary.length;i++){arrary[i]=sc.nextInt();}2.输⼊如何排序设置两条路径:m=1为从⼩到⼤,m=2为从⼤到⼩,m=其他提醒⽤户重新输⼊System.out.println("请问你想:1.从⼩到⼤ 2.从⼤到⼩排序?");m=sc.nextInt();while (m!=1 && m!=2 ){System.out.println("输⼊有误请再次输⼊");m = sc.nextInt();continue;}3.排序算法(1)数组长度 arrary.length 也就是⽤户输⼊的 n(2)j 表⽰第 j+1 轮排序,这⾥⾯n-1轮排序就已⾜够(3)k 表⽰第 k+1 个位置,arrary[k] 表⽰第 k+1 个位置的数(4)由于每⼀轮都能确定⼀个最⼤数排在最后,所以每⼀轮进⾏⽐较的数都会少⼀个,⽐较的次数也会少⼀个,所以是k<arrary.length-1-j(5)较⼤数与较⼩数交换位置的经典算法:若a>b; 则c=a; a=b; b=c;(6)从⼤到⼩排序只需把 arrary[k]>arrary[k+1] 换成 arrary[k]<arrary[k+1] 即可(7)选择进⾏何种排序,在 if 语句的判断框⾥加上此时m应该等于的值(8)因为要先选择进⾏何种排序,才能进⾏排序,所以把 m==1 放在 arrary[k]>arrary[k+1] 前⾯,且⽤短板与 && ,这样更易于理解(如果m≠1,则直接进⾏else if 的语句)(9)也可以 m==1 & arrary[k]>arrary[k+1] 或 arrary[k]>arrary[k+1] & m==1,但不能 arrary[k]<arrary[k+1] && m==2。
链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)
链表排序(冒泡、选择、插⼊、快排、归并、希尔、堆排序)这篇⽂章分析⼀下链表的各种排序⽅法。
以下排序算法的正确性都可以在LeetCode的这⼀题检测。
本⽂⽤到的链表结构如下(排序算法都是传⼊链表头指针作为参数,返回排序后的头指针)struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}};插⼊排序(算法中是直接交换节点,时间复杂度O(n^2),空间复杂度O(1))class Solution {public:ListNode *insertionSortList(ListNode *head) {// IMPORTANT: Please reset any member data you declared, as// the same Solution instance will be reused for each test case.if(head == NULL || head->next == NULL)return head;ListNode *p = head->next, *pstart = new ListNode(0), *pend = head;pstart->next = head; //为了操作⽅便,添加⼀个头结点while(p != NULL){ListNode *tmp = pstart->next, *pre = pstart;while(tmp != p && p->val >= tmp->val) //找到插⼊位置{tmp = tmp->next; pre = pre->next;}if(tmp == p)pend = p;else{pend->next = p->next;p->next = tmp;pre->next = p;}p = pend->next;}head = pstart->next;delete pstart;return head;}};选择排序(算法中只是交换节点的val值,时间复杂度O(n^2),空间复杂度O(1))class Solution {public:ListNode *selectSortList(ListNode *head) {// IMPORTANT: Please reset any member data you declared, as// the same Solution instance will be reused for each test case.//选择排序if(head == NULL || head->next == NULL)return head;ListNode *pstart = new ListNode(0);pstart->next = head; //为了操作⽅便,添加⼀个头结点ListNode*sortedTail = pstart;//指向已排好序的部分的尾部while(sortedTail->next != NULL){ListNode*minNode = sortedTail->next, *p = sortedTail->next->next;//寻找未排序部分的最⼩节点while(p != NULL){if(p->val < minNode->val)minNode = p;p = p->next;}swap(minNode->val, sortedTail->next->val);sortedTail = sortedTail->next;}head = pstart->next;delete pstart;return head;}};快速排序1(算法只交换节点的val值,平均时间复杂度O(nlogn),不考虑递归栈空间的话空间复杂度是O(1))这⾥的partition我们参考(选取第⼀个元素作为枢纽元的版本,因为链表选择最后⼀元素需要遍历⼀遍),具体可以参考这⾥我们还需要注意的⼀点是数组的partition两个参数分别代表数组的起始位置,两边都是闭区间,这样在排序的主函数中:void quicksort(vector<int>&arr, int low, int high){if(low < high){int middle = mypartition(arr, low, high);quicksort(arr, low, middle-1);quicksort(arr, middle+1, high);}}对左边⼦数组排序时,⼦数组右边界是middle-1,如果链表也按这种两边都是闭区间的话,找到分割后枢纽元middle,找到middle-1还得再次遍历数组,因此链表的partition采⽤前闭后开的区间(这样排序主函数也需要前闭后开区间),这样就可以避免上述问题class Solution {public:ListNode *quickSortList(ListNode *head) {// IMPORTANT: Please reset any member data you declared, as// the same Solution instance will be reused for each test case.//链表快速排序if(head == NULL || head->next == NULL)return head;qsortList(head, NULL);return head;}void qsortList(ListNode*head, ListNode*tail){//链表范围是[low, high)if(head != tail && head->next != tail){ListNode* mid = partitionList(head, tail);qsortList(head, mid);qsortList(mid->next, tail);}}ListNode* partitionList(ListNode*low, ListNode*high){//链表范围是[low, high)int key = low->val;ListNode* loc = low;for(ListNode*i = low->next; i != high; i = i->next)if(i->val < key){loc = loc->next;swap(i->val, loc->val);}swap(loc->val, low->val);return loc;}};快速排序2(算法交换链表节点,平均时间复杂度O(nlogn),不考虑递归栈空间的话空间复杂度是O(1))这⾥的partition,我们选取第⼀个节点作为枢纽元,然后把⼩于枢纽的节点放到⼀个链中,把不⼩于枢纽的及节点放到另⼀个链中,最后把两条链以及枢纽连接成⼀条链。
用Java实现常见的8种内部排序算法
⽤Java实现常见的8种内部排序算法⼀、插⼊类排序插⼊类排序就是在⼀个有序的序列中,插⼊⼀个新的关键字。
从⽽达到新的有序序列。
插⼊排序⼀般有直接插⼊排序、折半插⼊排序和希尔排序。
1. 插⼊排序1.1 直接插⼊排序/*** 直接⽐较,将⼤元素向后移来移动数组*/public static void InsertSort(int[] A) {for(int i = 1; i < A.length; i++) {int temp = A[i]; //temp ⽤于存储元素,防⽌后⾯移动数组被前⼀个元素覆盖int j;for(j = i; j > 0 && temp < A[j-1]; j--) { //如果 temp ⽐前⼀个元素⼩,则移动数组A[j] = A[j-1];}A[j] = temp; //如果 temp ⽐前⼀个元素⼤,遍历下⼀个元素}}/*** 这⾥是通过类似于冒泡交换的⽅式来找到插⼊元素的最佳位置。
⽽传统的是直接⽐较,移动数组元素并最后找到合适的位置*/public static void InsertSort2(int[] A) { //A[] 是给定的待排数组for(int i = 0; i < A.length - 1; i++) { //遍历数组for(int j = i + 1; j > 0; j--) { //在有序的序列中插⼊新的关键字if(A[j] < A[j-1]) { //这⾥直接使⽤交换来移动元素int temp = A[j];A[j] = A[j-1];A[j-1] = temp;}}}}/*** 时间复杂度:两个 for 循环 O(n^2)* 空间复杂度:占⽤⼀个数组⼤⼩,属于常量,所以是 O(1)*/1.2 折半插⼊排序/** 从直接插⼊排序的主要流程是:1.遍历数组确定新关键字 2.在有序序列中寻找插⼊关键字的位置* 考虑到数组线性表的特性,采⽤⼆分法可以快速寻找到插⼊关键字的位置,提⾼整体排序时间*/public static void BInsertSort(int[] A) {for(int i = 1; i < A.length; i++) {int temp = A[i];//⼆分法查找int low = 0;int high = i - 1;int mid;while(low <= high) {mid = (high + low)/2;if (A[mid] > temp) {high = mid - 1;} else {low = mid + 1;}}//向后移动插⼊关键字位置后的元素for(int j = i - 1; j >= high + 1; j--) {A[j + 1] = A[j];}//将元素插⼊到寻找到的位置A[high + 1] = temp;}}2. 希尔排序希尔排序⼜称缩⼩增量排序,其本质还是插⼊排序,只不过是将待排序列按某种规则分成⼏个⼦序列,然后如同前⾯的插⼊排序⼀般对这些⼦序列进⾏排序。
JAVA冒泡、插入、选择排序算法
import java.io.*;public class Paixu {// 冒泡排序法public void Maopao(int a[]) {for (int i = 1; i < a.length; i++) {for (int j = 0; j < a.length - i; j++) { if (a[j] > a[j + 1]) {int temp = a[j + 1];a[j + 1] = a[j];a[j] = temp;}}}System.out.println("\n" + "采用冒泡排序法:");}// 插入排序法:public void Charu(int a[]) {for (int i = 1; i < a.length; i++) {for (int j = 0; j < i; j++) {if (a[j] > a[i]) {int temp = a[i];for (int k = i; k > j; k--) {a[k] = a[k--];}a[j] = temp;}}}System.out.println("\n" + "采用插入排序法:");}// 选择排序法:public void Xuanze(int a[]) {for (int i = 0; i < a.length; i++) {int position = i;for (int j = i + 1; j < a.length; j++) {if (a[position] > a[j]) {int temp = a[position];a[position] = a[j];a[j] = temp;}}}System.out.println("\n" + "采用选择排序法:");}public void Print(int a[]) {System.out.println("从小到大排序结果为:");for (int i = 0; i < a.length; i++) {System.out.print(a[i] + ",");}}public static void main(String[] args) {int a[] = new int[5];Paixu px = new Paixu();BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));System.out.println("请输入五个整数:");for (int i = 0; i < a.length; i++) {try {String s = buf.readLine();int j = Integer.parseInt(s);a[i] = j;} catch (Exception e) {System.out.println("出错了!必须输入整数,请重新输入!");i--;}}System.out.println("您输入的整数依次为:");for (int i = 0; i < a.length; i++) {System.out.print(a[i] + ",");}System.out.println("\n" + "-------------");px.Maopao(a); // 调用冒泡算法px.Print(a);System.out.println("\n" + "-------------");px.Charu(a); // 调用插入算法px.Print(a);System.out.println("\n" + "-------------");px.Xuanze(a); // 调用选择算法px.Print(a);}}Java实现二分查找2008-11-19 21:38今天阿朗被问到二分查找竟然一着急没写出来。
java 排序方法
java 排序方法Java一种面向对象的程序设计语言,由 James Gosling其他 Sun Microsystems工于 1995 5发布,是最初的商业化 Java拟机实现,Java技术是功能强大而灵活的,它可以应用于众多领域。
在处理程序中,排序是一个非常重要的技术,可以有效地提高数据处理的效率。
在Java中,可以使用多种方法实现排序。
第一种是基于简单比较的排序方法,其中包括冒泡排序(Bubble Sort),选择排序(Selection Sort),插入排序(Insertion Sort)和希尔排序(Shell Sort)。
冒泡排序是基于简单比较的最简单算法,其原理是检查相邻的元素,如果第一个比第二个大,就交换它们。
通过重复这个过程,算法最终会将最大元素放到最右边。
冒泡排序是两层循环,外部循环控制循环次数,内部循环用于比较两个元素的大小,如果符合条件就进行交换。
选择排序(Selection Sort)也是基于简单比较,它的基本思想是从头到尾依次比较每个元素,将最小的元素放到数组的头部,接着比较第二小的元素,将其放到数组的第二个位置,以此类推,完成排序。
插入排序(Insertion Sort)也是一种比较简单的排序方法,它的原理是首先将第一个元素看作一个已排序的子序列,然后逐一将后面的元素插入到该子序列中,从而完成排序。
希尔排序(Shell Sort)是一种特殊的插入排序,它采用了插入排序的思想,但是将相距一定距离的元素插入到已排序的子序列中,从而达到提高排序效率的目的。
另一种是非基于简单比较的排序方法,其中包括快速排序(Quick Sort)和归并排序(Merge Sort)。
快速排序(Quick Sort)是一种比较典型的分治算法,它的基本思想是:首先在数组中选择一个中心点,将比中心点小的数放在左边,将比中心点大的数放在右边,然后依次对左右两边的数组进行快速排序,直到所有子数组有序。
归并排序(Merge Sort)也是一种分治算法,它的基本思想是将一个大的数组划分为两个小的子数组,然后将这两个子数组分别进行归并排序,最后将它们合并起来,形成一个有序的大数组。
冒泡排序法、选择排序法、插入排序法(java案例详解)
1.冒泡排序法/***功能:冒泡排序法*思想:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的排序码,*,若发现逆序这交换,使得排序码较小的元素逐渐从后部移向前部(从下标较大的单元移向下标)*较小的单元,,就像水底下的气泡一样逐渐向上冒。
*作者:徐守威*/package com.xushouwei;public class T4 {/***@param args*/public static void main(String[] args) {// TODO Auto-generated method stubint arr1[]={1,6,0,-1,9,-100,90};//开始排序,创建一个Bubble类Bubble bubble=new Bubble();bubble.sort(arr1);//输出最后结果for(int i=0;i<arr1.length;i++){System.out.print(arr1[i]+" ");}}}//定义一个Bubble类class Bubble{//排序方法public void sort(int arr[]){//第一层循环用来指定排序的次数//定义一个临时变量来存放交换的值int temp=0;for(int i=0;i<arr.length-1;i++){//内层循环开始逐一比较,如果我们发现前一个数比后一个数大,这交换for(int j=0;j<arr.length-1-i;j++){//进行前后比较if(arr[j]>arr[j+1]){//交换位置temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}}}2.选择排序法/***功能:选择排序法*思想:第一次从R[0]-R[N-1]中选取最小值,与R[0]交换,第二次从R[1]-R[N-1]中选取最小值,与R[1]交换,*第三次从R[2]-R[N-1]中选取最小值,与R[2]交换...第i次从R[i]-R[N-1]中选取最小值,与R[i-1]交换,*第n-1次从R[n-2]-R[N-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的*有序序列。
常用排序操作方法
常用排序操作方法
常用的排序操作方法有:
1. 冒泡排序(Bubble Sort):比较相邻的元素,如果前面的元素大于后面的元素则交换位置,依次比较直到最后一对元素。
2. 选择排序(Selection Sort):每次从未排序的序列中选择最小(最大)的元素,放到已排序的序列的末尾,直到全部元素排序完成。
3. 插入排序(Insertion Sort):将未排序的元素逐一插入到已排序的序列中的合适位置,从而实现排序。
4. 快速排序(Quick Sort):选择一个基准元素,将小于基准元素的放在左侧,大于基准元素的放在右侧,然后对左右两个子序列进行递归排序。
5. 归并排序(Merge Sort):将待排序序列不断二分为子序列,对子序列进行排序后再合并成有序序列。
6. 堆排序(Heap Sort):将待排序序列构建成最大(最小)堆,然后将堆顶元素与末尾元素交换,然后重新调整堆为最大(最小)堆。
这些排序方法都具有不同的时间复杂度和适用场景,可以根据实际情况选择使用。
JAVA冒泡排序从小到大和从大到小详细过程
public classபைடு நூலகம்bubleSort {
public static void main(String args[]) {
int a[]={6,4,5,7,3};
System.out.println("排序前的数组为:"); for(int i=0;i<a.length;i++)//打印排序前的数组 {
if(a[j]>a[j+1])//如果前一位大于后一位,则交换,大的数排在后面 {
int temp=a[j+1]; a[j+1]=a[j]; a[j]=temp; } } } for(int i=0;i<a.length;i++)//打印从小到大冒泡排序后的数组 { System.out.print("a["+i+"]="+a[i]+" "); } System.out.println(); System.out.println("从大到小冒泡排序后的数组为:"); for(int i=0;i<a.length-1;i++) { for(int j=0;j<a.length-1-i;j++) { if(a[j]<a[j+1])//如果前一位小于后一位,则交换,大的数排在前面 { int temp=a[j+1]; a[j+1]=a[j]; a[j]=temp; } } } for(int i=0;i<a.length;i++)//打印从大到小冒泡排序后的数组 { System.out.print("a["+i+"]="+a[i]+" "); } } } 运行结果:
Java常用排序算法程序员必须掌握的8大排序算法
分类:1)插入排序(直接插入排序、希尔排序)2)交换排序(冒泡排序、快速排序)3)选择排序(直接选择排序、堆排序)4)归并排序5)分配排序(基数排序)所需辅助空间最多:归并排序所需辅助空间最少:堆排序平均速度最快:快速排序不稳定:快速排序,希尔排序,堆排序。
先来看看8种排序之间的关系:1.直接插入排序(1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。
如此反复循环,直到全部排好顺序。
(2)实例(3)用java实现12345678911121314151617181920package com.njue;publicclass insertSort {public insertSort(){inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,2 5,53,51};int temp=0;for(int i=1;i<a.length;i++){int j=i-1;temp=a[i];for(;j>=0&&temp<a[j];j--){a[j+1]=a[j]; //将大于temp的值整体后移一个单位}a[j+1]=temp;}for(int i=0;i<a.length;i++){System.out.println(a[i]);}2. 希尔排序(最小增量排序)(1)基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差 d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。
当增量减到1时,进行直接插入排序后,排序完成。
(2)实例:(3)用java实现123456789101112131415161718192122232425262728293031publicclass shellSort { publicshellSort(){int a[]={1,54,6,3,78,34,12,45,56,100}; double d1=a.length;int temp=0;while(true){d1= Math.ceil(d1/2);int d=(int) d1;for(int x=0;x<d;x++){for(int i=x+d;i<a.length;i+=d){int j=i-d;temp=a[i];for(;j>=0&&temp<a[j];j-=d){a[j+d]=a[j];}a[j+d]=temp;}}if(d==1){break;}for(int i=0;i<a.length;i++){System.out.println(a[i]);}}3.简单选择排序(1)基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
编程排序的三种方法
编程排序的三种方法
排序是计算机科学中一个重要的基本操作,它可以帮助我们按
照一定的顺序重新组织数据。
在编程中,有很多种排序算法,我将
介绍其中的三种常见的排序方法,冒泡排序、插入排序和快速排序。
首先,冒泡排序是一种简单直观的排序算法,它重复地走访要
排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交
换过来。
这个过程持续重复,直到没有再需要交换,也就是说数列
已经排序完成。
冒泡排序的时间复杂度为O(n^2),在实际应用中并
不常用,因为它的效率较低。
其次,插入排序是一种简单直观的排序算法,它的工作原理是
通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序的时间复杂度为O(n^2),在小
规模数据或者基本有序的数据集上表现良好。
最后,快速排序是一种高效的排序算法,它采用分治的思想,
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的
所有数据都比另一部分小,然后再按此方法对这两部分数据分别进
行快速排序,整个排序过程可以递归进行。
快速排序的时间复杂度
为O(nlogn),在大多数情况下具有较高的效率。
总的来说,冒泡排序、插入排序和快速排序都是常见的排序算法,每种算法都有其适用的场景和特点,选择合适的排序算法可以提高程序的效率和性能。
希望这些信息对你有所帮助。
计算机专业知识模拟考卷
专业课原理概述部分一、选择题(每题1分,共5分)1. 计算机网络中,OSI模型共有几个层级?A. 5层B. 6层C. 7层D. 8层2. 下列哪种数据结构不是线性结构?A. 数组B. 队列C. 树D. 链表3. 在Java语言中,下列哪个关键字用于定义接口?A. classB. interfaceC. extendsD. implements4. 操作系统中,下列哪个进程调度算法可能导致饥饿现象?A. 先来先服务B. 短作业优先C. 优先级调度D. 时间片轮转5. 下列哪个不属于关系型数据库?A. MySQLB. OracleC. MongoDBD. SQL Server二、判断题(每题1分,共5分)1. 计算机硬件系统由CPU、内存、硬盘、输入输出设备组成。
()2. 在Python语言中,列表和元组都是不可变数据类型。
()3. TCP协议提供可靠的数据传输服务,而UDP协议提供不可靠的数据传输服务。
()4. 在HTML中,标签必须成对出现。
()5. 数据库事务具有原子性、一致性、隔离性和持久性。
()三、填空题(每题1分,共5分)1. 在计算机中,二进制数1111表示的十进制数是______。
2. 一个栈的输入序列为1、2、3、4、5,则不可能的输出序列是______。
3. 在C++语言中,静态成员函数不能访问非静态成员变量,非静态成员函数可以访问______。
4. 在Linux操作系统中,查看当前工作目录的命令是______。
5. 数据库设计中,将ER图转换为关系模型的过程称为______。
四、简答题(每题2分,共10分)1. 简述进程和线程的区别。
2. 什么是静态绑定和动态绑定?3. 请列举出三种常见的排序算法。
4. 简述TCP协议的三次握手过程。
5. 数据库索引的作用是什么?五、应用题(每题2分,共10分)1. 给定一个数组{5, 2, 8, 10, 3},请编写一个冒泡排序算法,对数组进行升序排序。
Java面试题合集Java中的排序算法
Java面试题合集Java中的排序算法Java面试题合集——Java中的排序算法排序算法是计算机科学中的基本算法之一,而在Java编程语言中,也提供了多种排序算法的实现。
掌握常见的排序算法是Java开发者面试时的重要考点之一。
本文将介绍Java中一些常用的排序算法,并对它们的原理、应用场景和性能进行讨论。
一、冒泡排序(Bubble Sort)冒泡排序是一种简单但效率较低的排序算法,它的基本思想是通过不断交换相邻元素的位置,将较大或较小的元素逐渐“冒泡”到数组的一端。
具体实现如下:```javapublic static void bubbleSort(int[] arr) {int n = arr.length;for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}```冒泡排序的时间复杂度为O(n^2),因此对于大规模数据的排序效率较低。
但它的实现简单,对于小规模数据或基本有序的数据仍然具有一定优势。
二、选择排序(Selection Sort)选择排序是一种简单但效率较低的排序算法,它每次从待排序的元素中选择最小(或最大)的元素放到已排序的部分末尾。
通过不断选择并交换元素,实现整个数组的排序。
具体实现如下:```javapublic static void selectionSort(int[] arr) {int n = arr.length;for (int i = 0; i < n - 1; i++) {int minIndex = i;for (int j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}int temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}}```选择排序的时间复杂度同样为O(n^2),虽然在大规模数据的排序中效率较低,但由于每次只需交换一次元素,因此相对于冒泡排序而言,选择排序的性能略高。
Java之数组的简单排序(选择,冒泡,插入)
Java之 数 组 的 简 单 排 序 ( 选 择 , 冒 泡 , 插 入 )
1.冒泡排序
/** * 冒泡排序 * @param a */ public void sort(int a[]) { System.out.println("bubble_sort:");//将最大的数字冒泡到最后 for(int i = 0;i < a.length;i++) { for(int j = 0;j < a.length - i -1;j++) { if(a[j] > a[j + 1]) { int temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } showArray(a); }
3.插入排序
/** * 插入排序 * @param a */ public void sort(int a[]) { System.out.println("Insert_Sort:"); for(int iห้องสมุดไป่ตู้= 0;i < a.length;i++) { for(int j = i;j > 0;j--) { if(a[j] < a[j-1]) { int temp = a[j]; a[j] = a[j-1]; a[j-1] = temp; } } } showArray(a); }
2.选择排序
/** * 选择排序 * 先选择一个最大的放在最后,再从剩下的当中选择最大的放在倒数第二位 * 以此类推 * @param a */ public void sort(int a[]) { System.out.println("select_sort:"); for(int i = 1;i < a.length;i++) { int max = 0;//初始max设置为0 for(int j = 1;j <= a.length - i;j++) { if(a[j] > a[max])//刷新最大值 max = j; } //System.out.println("max = " + a[max]); int temp = a[max];//此时max保存的就是最大值 a[max] = a[a.length - i]; a[a.length - i] = temp; } showArray(a); }
冒泡排序、选择排序、插入排序、快速排序(java)
冒泡排序、选择排序、插入排序、快速排序package com.test;/*** 排序(升序)** @author xlfdzhf*/public class Sort {/**冒泡排序复杂度O(n^2)** 1.比较相邻的元素。
如果第一个比第二个大,就交换他们两个。
* 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。
在这一点,最后的元素应该会是最大的数。
* 3.针对所有的元素重复以上的步骤,除了最后一个。
* 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
**/public static void bubbleSort(int intarrary[]){int temp=0;for(int i=intarrary.length;i>0;i--){for(int j=0;j<i-1;j++){if(intarrary[j]>intarrary[j+1]){temp=intarrary[j];intarrary[j]=intarrary[j+1];intarrary[j+1]=temp;}}}}/**选择排序复杂度O(N^2)** 1.首先在未排序的元素中找到最小的元素放在排序序列的起始位置* 2.然后在从剩下的序列元素中继续找到最小元素,然后放在已排序序列的末尾**/public static void selectionSort(int intarrary[]){int temp=0;for(int i=0;i<intarrary.length;i++){for(int j=i+1;j<intarrary.length;j++){if(intarrary[j]<intarrary[i]){temp=intarrary[i];intarrary[i]=intarrary[j];intarrary[j]=temp;}}}}/**插入排序最差复杂度O(N^2) 最优时间复杂度O(N) 平均时间复杂度O(N^2) 空间复杂度O(N)和冒泡排序是一个级别** 1.默认第一个元素是已被排序* 2.取出下一个元素与它前一个元素进行比较* 3.如果已排序的元素大于该元素则将该元素移动到下一位置* 4.直到找到小于或等于的该元素的位置,将该元素插入到该位置,至此完成取出的那个元素的排序* 5.重复2~3步,直到取出的最后的一个元素完成排序**/public static void InsertSort(int intarrary[]){int temp=0,j=1;for(int i=j;i<intarrary.length;j++,i=j){while(intarrary[i]<intarrary[i-1]){temp=intarrary[i];intarrary[i]=intarrary[i-1];intarrary[i-1]=temp;i--;if(i==0){break;}}}}/**快速排序最差复杂度O(N^2)** 快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),* 然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右* 边的元素值都不小于基准值,如此作为基准的元素调整到排序后的正确* 位置。
总结4种常用排序(快排、选择排序、冒泡排序、插入排序)
总结4种常⽤排序(快排、选择排序、冒泡排序、插⼊排序)⼀、选择排序1. 概念理解:最⼩的数值与第⼀个元素交换;在⼀个长度为3的数组中,在第⼀趟遍历3个数据,找出其中最⼩的数值与第⼀个元素交换最⼩的元素与第⼀个数交换(注意:这⾥的第⼀个数是指遍历的第⼀个数,实质上是数组的第⼆个数)第⼆趟遍历2个数据,找出其中最⼩的元素与第⼀个数交换⽽第三趟则是和⾃⼰⽐较,位置还是原来的位置2. 复杂度:平均时间复杂度:O(n^2)3. 例⼦://选择排序function selectionSortFn(arr){console.log('原数组:['+ arr + ']')for (var i = 0; i < arr.length; i++) {for (var j = i+1; j < arr.length; j++) {if (arr[i] > arr[j]) {var temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}console.log(arr);}return arr;}var initArr = [10, 4, 8, 3];selectionSortFn(initArr);我们看⼀下打印的结果:![选择排序]原数组:[10,4,8,3][3, 10, 8, 4][3, 4, 10, 8][3, 4, 8, 10][3, 4, 8, 10]结合概念就很好理解了。
⼆、冒泡排序1. 概念理解:依次⽐较相邻的两个数,将⼩数放在前⾯,⼤数放在后⾯。
第⼀趟:⾸先⽐较第⼀个和第⼆个数,将⼩数放前,⼤数放后,然后⽐较第⼆个数和第三个数将⼩数放前,⼤数放后,如此继续,直⾄⽐较最后两个数,将⼩数放前,⼤数放后,⾄此第⼀趟结束。
在第⼆趟:仍从第⼀对数开始⽐较(因为可能由于第2个数和第3个数的交换,使得第1个数不再⼩于第2个数),将⼩数放前中,⼤数放后,⼀直⽐较到倒数第⼆个数(倒数第⼀的位置上已经是最⼤的),第⼆趟结束。
Java中选择排序,冒泡排序,插入排序,快速排序
Java中选择排序,冒泡排序,插⼊排序,快速排序⼀:冒泡法排序//冒泡排序注:从⼩到⼤排//特点:效率低,实现简单//思想:每⼀趟将待排序序列中最⼤元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素。
这只是冒泡排序的⼀种,当然也可以从后往前排。
算法步骤⽐较相邻的元素。
如果第⼀个⽐第⼆个⼤,就交换他们两个。
对每⼀对相邻元素作同样的⼯作,从开始第⼀对到结尾的最后⼀对。
这步做完后,最后的元素会是最⼤的数。
针对所有的元素重复以上的步骤,除了最后⼀个。
持续每次对越来越少的元素重复上⾯的步骤,直到没有任何⼀对数字需要⽐较。
动画演⽰参考代码public static void bubbleSort(int array[]) {int t = 0;for (int i = 0; i < array.length - 1; i++)for (int j = 0; j < array.length - 1 - i; j++)if (array[j] > array[j + 1]) {t = array[j];array[j] = array[j + 1];array[j + 1] = t;}}⼆:选择排序//选择排序从⼩到⼤//特点:效率低,容易实现。
//思想:每⼀趟从待排序序列选择⼀个最⼩的元素放到已排好序序列的末尾,剩下的为待排序序列,重复上述步骤直到完成排序。
算法步骤⾸先在未排序序列中找到最⼩(⼤)元素,存放到排序序列的起始位置再从剩余未排序元素中继续寻找最⼩(⼤)元素,然后放到已排序序列的末尾。
重复第⼆步,直到所有元素均排序完毕。
动画演⽰参考代码public static void selectSort(int array[]) {int t = 0;for (int i = 0; i < array.length - 1; i++){int index=i;for (int j = i + 1; j < array.length; j++)if (array[index] > array[j])index=j;if(index!=i){ //找到了⽐array[i]⼩的则与array[i]交换位置t = array[i];array[i] = array[index];array[index] = t;}}}三:插⼊排序//插⼊排序从⼩到⼤//特点:效率低,容易实现。
java的排序方法
java的排序方法
Java提供了多种排序方法,可以根据不同的需求选择不同的方法。
常用的排序方法包括:
1. 冒泡排序:比较相邻的元素,如果前一个元素大于后一个元素,则交换它们的位置,重复此过程直到整个序列有序。
2. 选择排序:每次选择最小的元素,放到已排好序的序列的末尾,重复此过程直到整个序列有序。
3. 插入排序:将未排序的元素插入到已排好序的序列中的合适位置,重复此过程直到整个序列有序。
4. 快速排序:选择一个元素作为基准,将小于基准的元素放到基准的左边,大于基准的元素放到基准的右边,重复此过程直到整个序列有序。
5. 归并排序:将序列分成两个子序列,对子序列进行排序,然后将排序后的子序列合并成一个有序序列,重复此过程直到整个序列有序。
除了以上常用的排序方法,Java还提供了Arrays.sort()方法,可以对数组进行排序,该方法采用快速排序算法实现。
此外,Java
还提供了Collections.sort()方法,可以对集合进行排序,该方法采用归并排序算法实现。
- 1 -。
黑马程序员JavaEE基础-冒泡排序
黑马程序员JavaEE根底-冒泡排序今天给大家详细讲解一个案例:数组冒泡排序。
具体是这样的:有一个数组int[] arr = {24, 69, 80, 57, 13}; 把这个数组按从大到小的顺序排列。
我们冒泡排序的思路是这样的:从头开始两两比拟,也就是0索引和1索引的元素比拟,如果1索引比拟大就交换位置,然后1索引和2索引元素比拟,以此类推。
大的数组就像水里的泡泡一样,越接近水面气泡越大。
好的,让我们画几个泡泡吧!这是数组原来的样子,我们按照数字的大小画了泡泡。
一个泡泡从水里冒出到水面,随着压强的减小,气泡是越来越大的,所以我们这个看着就不太对啦。
我们开始排序吧。
[Java] 纯文本查看 复制代码?1 2 for (int i = 0; i <- 1; ifor (int j = 0; j < - 1 - i; j++) {// -1为了防止索引越界,-i 为了提高效率〔后面排好序的就不比拟了〕3 4 5 6 7 8 9 if (arr[j] > arr[j + 1]) {// j 元素跟j+1比拟int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}第一次比拟:24和69比拟-交换,24和80比拟-交换,24和57比拟-交换,24和13比拟-不交换,因此第一次遍历之后顺序为:我们发现13 、24、57的顺序已经排好。
接下来我们继续分析排序步骤:69和80比拟-交换,69和57比拟-不交换,57和24比拟-不交换,24和13比拟-不交换。
至此我们就排好啦,通过图片是不是很直观就明白了冒泡排序的过程?哈哈~。