1.排序比较:
2.冒泡排序的意义在于:
每一轮,把所有的值比较一遍,把最小/最大的挑到一端。
int[] is = {11,0,-1,21,93,99,-14};//不清楚,这个数据集当中,数据的分布情况 for(int i = 0 ; i < is.length - 1 ; i ++){ for(int j = i + 1; j < is.length ; j ++){ if(is[i]>is[j]){ int temp = is[i]; is[i] = is[j]; is[j] = temp; } } }
3.选择排序的意义在于:
每一轮,把最小或者最大的那个值的游标找出来,然后和基准值交换,一轮只交换一次
int[] is = {11,0,-1,21,93,99,-14}; for(int i = 0 ; i < is.length - 1 ; i ++){ int minIndex = i; for(int j = i + 1 ; j < is.length ; j ++){ if(is[j] < is[minIndex]){ minIndex = j; } } int temp = is[minIndex]; is[minIndex] = is[i]; is[i] = temp; }
4.插入排序的意义在于:
稳定的把后面的值,在已排序好的序列中,找到合适的位置
int[] is = {11,0,-1,21,93,99,-14}; //j不能等于0,因为j要和前面一个比 //j前面的一个值,一定比他小,后面一定比他大 //就以上两点,倒过来说:j如果没到1,同时j比前面一个小的时候,循环要继续下去 for(int i = 1 ; i < is.length ; i ++){ for(int j = i ; j > 0 && is[j] < is[j-1]; j --){ int temp = is[j]; is[j] = is[j-1]; is[j-1] = temp; System.out.println(Arrays.toString(is)); } }
5.希尔排序:
1.基本思想:
(1)基于插入排序
(2)对原本的数列进行分组,然后对每一组分别进行插入排序
(3)分组的目标是让最后一次排序前,数列能够基本有序
int[] is = {11,2,-1,0,5,8,99,1,21}; //1.创建增量 int g = 1;//起始 while(g < is.length) { g = g * 3 + 1; } while(g > 0) { //2.分组 for(int i = g ; i <is.length ; i ++) { int temp = is[i];//插入排序开始的游标 int j = i - g;//前一个值的游标 //插入 while(j >= 0 && is[j] > temp) { is[j + g] = is[j]; j -= g; } is[j + g] = temp; } g = g / 3; } System.out.println(Arrays.toString(is));
6.快速排序:
1.基本思想:
(1)分治
(2)通过冒泡的方式来完成内部排序
(3)三数取中法
public static void main(String[] args) { //快速排序 int[] is = {11,2,-1,0,5,8,99,1,21}; sort(is,0,is.length -1); System.out.println(Arrays.toString(is)); } //left:左指针 //right:右指针 public static void sort(int[] is , int left , int right) { if(left < right) { //找基准值 dealPivot(is,left,right); //找到基准值所在的位置 int pivot = right - 1; //左指针 int i = left; //右指针 int j = right - 1; while(true) { //从左往右,和基准值比较,找到一个比基准值大的位置停下来 while(is[++i]<is[pivot]) {}//如果比基准值小,则一直循环 //从右往左,和基准值比较,找到一个比基准值小的位置停下来 while(j>left && is[--j]>is[pivot]) {}//如果比基准值大,则一直循环 //当这两个循环全部停下来的时候 //交换i和j if(i < j) { swap(is,i,j); }else { //i和j发生碰撞,循环结束 break; } } //把基准值和他前面的一个值交换位置 if(i < right) { swap(is,i,right - 1); } //已基准值所在位置开始分区 sort(is , left , i - 1); sort(is , i + 1 , right); } } //寻找基准值 public static void dealPivot(int[] is , int left , int right) { //三数取中 int mid = (left + right) / 2; //三数取出来了,要对这三个数,完成排序 if(is[left] > is[mid]) { swap(is,left , mid); } if(is[left] > is[right]) { swap(is,left , right); } if(is[right] < is[mid]) { swap(is,right , mid); } //把他移动到末尾之前 swap(is,right-1 , mid); } public static void swap(int[] is , int a , int b) { int temp = is[a]; is[a] = is[b]; is[b] = temp; }