赞
踩
目录
冒泡排序思路:(两层for循环)
代码:
-
- public class Demo01 {
- public static void main(String[] args) {
- int[] arr=new int[]{1,5,7,4,8,9};
- Demo01.sort(arr);
- }
- public static void sort(int arr[]){
- for( int i = 0 ; i < arr.length - 1 ; i++ ) {
- for (int j = 0; j < arr.length - 1 - i; j++) {
- int temp = 0;
- if (arr[j] > arr[j + 1]) {
- temp = arr[j];
- arr[j] = arr[j + 1];
- arr[j + 1] = temp;
- }
- }
- }
- System.out.println(Arrays.toString(arr));
- }
-
- }
-
-
首先选取一个基准数
快速排序思路:
代码:
- public class Demo02 {
- public static void main(String[] args) {
- int[] arr=new int[]{1,5,3,6,7,4,8};
- Demo02.sort(arr,0,6);
- System.out.println(Arrays.toString(arr));
- }
- public static int potation(int[] nums,int low,int high){
- int point=nums[low];
- while(low<high){
- while(low < high &&nums[high]>=point) high--;
- nums[low]=nums[high];
- while(low < high &&nums[low]<=point) low++;
- nums[high]=nums[low];
- }
- nums[low]=point;
- return low;
- }
- public static void sort(int[] nums,int low,int high){
- if(low<high){
- int pivotpos=potation(nums,low,high);
- sort(nums,low,pivotpos-1);
- sort(nums,pivotpos+1,high);
- }
- }
- }
插入排序思路:
代码:
- public static void sort(int[] arr) {
- int n = arr.length;
- for (int i = 1; i < n; ++i) {
- int value = arr[i];
- int j = 0;//插入的位置
- for (j = i-1; j >= 0; j--) {
- if (arr[j] > value) {
- arr[j+1] = arr[j];//移动数据
- } else {
- break;
- }
- }
- arr[j+1] = value; //插入数据
- }
- }
希尔排序思路:
代码:
- public int[] shellSort(int[] A, int n) {
- //要插入的纸牌
- int temp,j,i;
- //设定增量D,增量D/2逐渐减小
- for(int D = n/2;D>=1;D=D/2){
-
- //从下标d开始,对d组进行插入排序
- for(j=D;j<n;j++){
-
- temp = A[j];
- for(i=j;i>=D&&A[i-D]>temp;i-=D){
- A[i]=A[i-D];
- }
-
- A[i]=temp;
- }
-
- }
-
- return A;
- }
每次挑出最小的元素
代码:
- public static void sort(int arr[]){
- for( int i = 0;i < arr.length ; i++ ){
- int min = i;//最小元素的下标
- for(int j = i + 1;j < arr.length ; j++ ){
- if(arr[j] < arr[min]){
- min = j;//找最小值
- }
- }
- //交换位置
- int temp = arr[i];
- arr[i] = arr[min];
- arr[min] = temp;
- }
- }
-
代码:
- public int[] heapSort(int[] A, int n) {
- //堆排序算法
-
- int i;
- //先把A[]数组构建成一个大顶堆。
- //从完全二叉树的最下层最右边的非终端结点开始构建。
- for(i=n/2-1;i>=0;i--){
- HeapAdjust(A,i,n);
- }
-
- //开始遍历
- for(i=n-1;i>0;i--){
- swap(A,0,i);
- //每交换一次得到一个最大值然后丢弃
- HeapAdjust(A,0,i);
- }
- return A;
-
- }
- //A[i]代表的是下标为i的根结点
- private void HeapAdjust(int[] A,int i,int n){
- int temp;
-
- temp = A[i];
-
- for(int j=2*i+1;j<n;j=j*2+1){
-
- if(j<n-1&&A[j]<A[j+1]){
- ++j;
- }
-
- if(temp>=A[j]){
- break;
- }
- //将子节点赋值给根结点
- A[i] = A[j];
- //将子节点下标赋给i
- i = j;
- }
- //将存储的根结点的值赋给子节点
- A[i] = temp;
-
- }
- private void swap(int[] A,int i,int j){
- int temp = A[i];
- A[i]=A[j];
- A[j] = temp;
-
- }
-
将其分成两路,每路再分两路,依次排序
计数排序步骤:
代码:
- public static void sort(int[] arr) {
- //找出数组中的最大值
- int max = arr[0];
- for (int i = 1; i < arr.length; i++) {
- if (arr[i] > max) {
- max = arr[i];
- }
- }
- //初始化计数数组
- int[] countArr = new int[max + 1];
-
- //计数
- for (int i = 0; i < arr.length; i++) {
- countArr[arr[i]]++;
- arr[i] = 0;
- }
-
- //排序
- int index = 0;
- for (int i = 0; i < countArr.length; i++) {
- if (countArr[i] > 0) {
- arr[index++] = i;
- }
- }
- }
类似于计数排序,将桶分好类,一定范围,再对桶内元素排序
- public int[] countingSort(int[] A, int n) {
- if(A==null ||n<2){
- return A;
- }
- //找出桶的范围,即通过要排序的数组的最大最小值来确定桶范围
- int min=A[0];
- int max=A[0];
- for(int i=0;i<n;i++){
- min=Math.min(A[i],min);
- max=Math.max(A[i],max);
- }
- //确定桶数组,桶的下标即为需排序数组的值,桶的值为序排序数同一组值出现的次数
- int[] arr = new int[max-min+1];
- //往桶里分配元素
- for(int i=0;i<n;i++){
- arr[A[i]-min]++;
- }
-
- //从桶中取出元素
- int index=0;
- for(int i=0;i<arr.length;i++){
- while(arr[i]-->0){
- A[index++]=i+min;
- }
- }
-
- return A;
- }
基数排序步骤:
这篇文章对排序解释我认为比较清楚:https://blog.csdn.net/amazing7/article/details/51603682
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。