数组中常用的几种排序方法
数据结构中的排序算法有很多:
选择排序 、交换排序、冒泡排序、希尔排序、快速排序、归并排序等等。
实际上,排序的方式不止这种,使用不同的思路,会得到不同的排序代码,下面给大家介绍几种常用的排序方法,供大家参考。
1.交换排序方法
交换排序的思路是首先找到最小的数,将他放到第一个位置,其次找到第二大的数,将他放到第二位置,如此知道找到n-1个数。
1 for (int i = 0; i < nums.Length - 1; i++) 2 { 3 //在 i-(nums.Length-1) 范围内,将该范围内最小的数字提到i 4 for (int j = i + 1; j < nums.Length; j++) 5 { 6 if (nums[i] > nums[j]) 7 { 8 //交换 9 int temp = nums[i]; 10 nums[i] = nums[j]; 11 nums[j] = temp; 12 } 13 } 14 }
2.冒泡排序:将下标0-n范围内的最大值沉到n位置,同理0-n-1的最大值沉到n-1位置。。。。。
1 for (int i = nums.Length - 1; i > 0; i--) 2 { 3 //在 0-i 范围内,将该范围内最大的数字沉到i 4 for (int j = 0; j < i; j++) 5 { 6 if (nums[j] > nums[j+1]) 7 { 8 //交换 9 int temp = nums[j]; 10 nums[j] = nums[j+1]; 11 nums[j+1] = temp; 12 } 13 } 14 }
3.选择排序的总体思路和交换排序的总体思路相似,都是将某个范围内的最小数提到该范围内的第一位,它的代码结构跟交换排序也是完全相同的:
1 for (int i = 0; i < nums.Length - 1; i++) 2 { 3 //在 i-(nums.Length-1) 范围内,将该范围内最小的数字提到i 4 //1. 首先找到 i - (nums.Length-1) 范围内的最小数所在的下标 5 int index = i; //先假设最小数的下标是i 6 for (int j = i + 1; j < nums.Length; j++) 7 { 8 if (nums[j] < nums[index]) 9 { 10 //发现了更小的数 11 index = j;//记录下标 12 } 13 } 14 //2. 然后将nums[i]和nums[index]的值交换 15 int temp = nums[i]; 16 nums[i] = nums[index]; 17 nums[index] = temp; 18 }
4.快速排序方法是将一个数组的排序问题看成是两个小数组的排序问题,而每个小的数组又可以继续看成更小的两个数组,一直递归下去,直到数组长度大小最大为2。实现如下:
1 public int[] fast(int[] arr,int left,int right){ 2 if(left < right){ 3 int s = arr[left]; 4 int i = left; 5 int j = right + 1; 6 while(true){ 7 //向右找大于s的元素的索引 8 while(i+1 < arr.length && arr[++i] < s); 9 //向左找小于s的元素的索引 10 while(j-1 > -1 && arr[--j] > s); 11 //如果i >= j 推出循环 12 if(i >= j){ 13 break; 14 }else{ 15 //教化i和j位置的元素 16 int t = arr[i]; 17 arr[i] = arr[j]; 18 arr[j] = t; 19 } 20 } 21 arr[left] = arr[j]; 22 arr[j] = s; 23 //对左面进行递归 24 fast(arr,left,j-1); 25 //对右面进行递归 26 fast(arr,j+1,right); 27 } 28 return arr; 29 }
排序算法有很多种,针对不同语言同时也有不同的方法,基础常用的排序方法就是以上几种,每一种都有各自的优劣,只有看情况选择适当的方法才能做到更高的效率。