數組中常用的幾種排序方法
數據結構中的排序算法有很多:
選擇排序 、交換排序、冒泡排序、希爾排序、快速排序、歸並排序等等。
實際上,排序的方式不止這種,使用不同的思路,會得到不同的排序代碼,下面給大家介紹幾種常用的排序方法,供大家參考。
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 }
排序算法有很多種,針對不同語言同時也有不同的方法,基礎常用的排序方法就是以上幾種,每一種都有各自的優劣,只有看情況選擇適當的方法才能做到更高的效率。