十大排序算法
2021-03-31 12:02:31 28 举报
AI智能生成
请大家不要直接克隆,着手梳理一遍才会变成自己的知识
作者其他创作
大纲/内容
选择排序
时间复杂度
O(N²)
空间复杂度
O(1)
稳定性
不稳定
<span style="font-size: inherit;">7 5 10 <b><font color="#c41230">10</font></b> </span><b style="font-size: inherit;"><font color="#ff99cc">2</font></b><span style="font-size: inherit;"> 4 </span><font style="font-size: inherit;" color="#f68b1f"><b style="">2</b></font><br>
<span style="font-size: inherit;">7 5 10 </span><b><font color="#f15a23">2</font></b><span style="font-size: inherit;"> </span><b style="font-size: inherit;"><font color="#ff99cc">2</font></b><span style="font-size: inherit;"> 4 <font color="#c41230" style=""><b>10</b></font></span><br>
代码实现
<pre style="background-color: rgb(43, 43, 43); font-family: "JetBrains Mono", monospace; font-size: 9.8pt; color: rgb(169, 183, 198);">public static void sort(int[] nums){<br> for (int end = nums.length - 1; end > 0; end--) {<br> int maxIndex = 0;<br> //start <= end有助于解决一定的不稳定性,但不是完全解决<br> for(int start = 1; start <= end ;start++){<br> if(nums[start] >= nums[maxIndex]){<br> maxIndex = start;<br> }<br> }<br> int temp = nums[maxIndex];<br> nums[maxIndex] = nums[end];<br> nums[end] = temp;<br> }<br> }<br></pre>
冒泡排序
时间复杂度
最坏---逆序
O(N²)
最好---完全有序
O(N)
空间复杂度
O(1)
稳定性
稳定
代码实现
基础版
<pre style="background-color: rgb(43, 43, 43); font-family: "JetBrains Mono", monospace; font-size: 9.8pt; color: rgb(169, 183, 198);"> public static void sort(int[] nums){<br> for (int end = nums.length - 1; end > 0; end--) {<br> for(int start = 0; start < end ;start++){<br> if(nums[start] > nums[start+1]){<br> int temp = nums[start+1];<br> nums[start+1] = nums[start];<br> nums[start] = temp;<br> }<br> }<br> }<br> }<br></pre>
本身就是升序
<pre style="background-color: rgb(43, 43, 43); font-family: "JetBrains Mono", monospace; font-size: 9.8pt; color: rgb(169, 183, 198);"> public static void sort(int[] nums){<br> for (int end = nums.length - 1; end > 0; end--) {<br> //判断是否本身就有序的标志<br> boolean sorted = true;<br> for(int start = 0; start < end ;start++){<br> if(nums[start] > nums[start+1]){<br> int temp = nums[start+1];<br> nums[start+1] = nums[start];<br> nums[start] = temp;<br> //一旦出现一次交换,则无序<br> sorted = false;<br> }<br> }<br> //如果没有重排,则数组有序<br> if(sorted)break;<br> }<br> }<br></pre>
尾部局部有序,减少比较次数<br>
<pre style="background-color: rgb(43, 43, 43); font-family: "JetBrains Mono", monospace; font-size: 9.8pt; color: rgb(169, 183, 198);"> public static void sort(int[] nums){<br> for (int end = nums.length - 1; end > 0; end--) {<br> //判断是否本身就有序的标志<br> boolean sorted = true;<br> //如果last=end,数组完全有序,last则不会变化,就会退回基础版<br> int last = 1;<br> for(int start = 0; start < end ;start++){<br> if(nums[start] > nums[start+1]){<br> int temp = nums[start+1];<br> nums[start+1] = nums[start];<br> nums[start] = temp;<br> last = start + 1;<br> //一旦出现一次交换,则无序<br> sorted = false;<br> }<br> }<br> end = last;<br> //如果没有重排,则数组有序<br> if(sorted)break;<br> }<br> }<br></pre>
插入排序
时间复杂度
O(N²)
空间复杂度
O(1)
稳定性
稳定
代码实现
<pre style="background-color: rgb(43, 43, 43); font-family: "JetBrains Mono", monospace; font-size: 9.8pt; color: rgb(169, 183, 198);"> public static void sort(int[] arr){<br> for (int i = 1; i < arr.length; i++) {<br> int temp = arr[i];<br> int j = i;<br> while(j > 0 && temp < arr[j - 1]){<br> arr[j] = arr[j - 1];<br> j--;<br> }<br> arr[j] = temp;<br> }<br> }<br></pre>
快速排序
时间复杂度
O(nlogn)
空间复杂度
O(logn)
稳定性
稳定
代码实现
<pre style="background-color: rgb(43, 43, 43); font-family: "JetBrains Mono", monospace; font-size: 9.8pt; color: rgb(169, 183, 198);">public static void sort(int[] arr,int left,int right){<br> if(left >= right)return;<br> int i = left, j = right;<br> //取第一个数作为基数<br> int temp = arr[left];<br> while(i < j){<br> //先从右往左找,填第一个坑<br> while (i < j && arr[j] > temp)j--;<br> if(i < j)arr[i++] = arr[j];<br> while (i < j && arr[i] < temp)i++;<br> if(i < j)arr[j--] = arr[i];<br> }<br> arr[i] = temp;<br> sort(arr,left,i-1);<br> sort(arr,i+1,right);<br> }<br></pre>
归并排序
时间复杂度
O(nlogn)
空间复杂度
O(N)
稳定性
稳定
代码实现
<pre style="background-color: rgb(43, 43, 43); font-family: "JetBrains Mono", monospace; font-size: 9.8pt; color: rgb(169, 183, 198);"> public static void sort(int[] arr,int left,int right){<br> if (left >= right)return;<br> int mid = left + (right - left) / 2;<br> sort(arr,left,mid);<br> sort(arr,mid+1,right);<br> merge(arr,left,mid+1,right);<br> }<br><br> public static void merge(int[] arr,int left,int mid,int right){<br> int[] temp = new int[right - left + 1];<br> int index = 0;<br> int i = left;<br> int j = mid;<br> while(i < mid && j <= right){<br> if(arr[i] < arr[j]){<br> temp[index++] = arr[i++];<br> }else{<br> temp[index++] = arr[j++];<br> }<br> }<br> while (i < mid){<br> temp[index++] = arr[i++];<br> }<br> while (j <= right){<br> temp[index++] = arr[j++];<br> }<br> index = 0;<br> for (int k = left; k <= right; k++) {<br> arr[k] = temp[index++];<br> }<br> }<br></pre>
堆排序<br>
时间复杂度
O(nlogn)
空间复杂度
O(1)
稳定性
不稳定
代码实现
<pre style="background-color: rgb(43, 43, 43); font-family: "JetBrains Mono", monospace; font-size: 9.8pt; color: rgb(169, 183, 198);"> public static void sort(int[] arr){<br> int len = arr.length;<br> //构建大顶堆<br> for (int i = (len - 1 ) / 2; i >= 0; i--) {<br> heapify(arr, i, len);<br> }<br> for (int i = len - 1; i >= 0 ; i--) {<br> System.out.println(arr[0]);<br> swap(arr,i,0);<br> heapify(arr,0,i);<br> }<br> }<br><br> public static void heapify(int arr[],int now,int len){<br> int left = 2 * now + 1;<br> int right = 2 * now + 2;<br> int maxIndex = now;<br> if(left < len && arr[left] > arr[maxIndex]){<br> maxIndex = left;<br> }<br> if(right < len && arr[right] > arr[maxIndex]){<br> maxIndex = right;<br> }<br> if(maxIndex != now){<br> swap(arr,maxIndex,now);<br> heapify(arr,maxIndex,len);<br> }<br> }<br><br> public static void swap(int[] arr, int i, int j){<br> int temp = arr[i];<br> arr[i] = arr[j];<br> arr[j] = temp;<br> }<br></pre>
希尔排序
时间复杂度
O(N^1.3)
空间复杂度
O(1)
稳定性
不稳定
代码实现
基础版
<pre style="background-color: rgb(43, 43, 43); font-family: "JetBrains Mono", monospace; font-size: 9.8pt; color: rgb(169, 183, 198);"> public static void sort(int[] arr){<br> //gap是空格间隙<br> for(int gap = 4; gap > 0; gap/=2){<br> //内部还是插入排序<br> for (int i = gap; i < arr.length; i++) {<br> int j = i;<br> int temp = arr[j];<br> while(j > gap - 1 && temp < arr[j-gap]){<br> arr[j] = arr[j-gap];<br> j -= gap;<br> }<br> arr[j] = temp;<br> }<br> }<br> }<br></pre>
基于Knuth的序列,h = 3h +1
<pre style="background-color: rgb(43, 43, 43); font-family: "JetBrains Mono", monospace; font-size: 9.8pt; color: rgb(169, 183, 198);">public static void sort(int[] arr){<br> int h = 1;<br> while(h <= arr.length/3){<br> h = h*3 + 1;<br> }<br> for(int gap = h; gap > 0; gap = (gap-1)/3){<br> //内部还是插入排序<br> for (int i = gap; i < arr.length; i++) {<br> int j = i;<br> int temp = arr[j];<br> while(j > gap - 1 && temp < arr[j-gap]){<br> arr[j] = arr[j-gap];<br> j -= gap;<br> }<br> arr[j] = temp;<br> }<br> }<br> }<br></pre>
桶排序
时间复杂度
O(n+k)
空间复杂度
O(n+k)
稳定性
根据桶内排序算法而定
代码实现
形式不固定
基数排序
时间复杂度
O(n*k)
空间复杂度
O(n*k)
稳定性
稳定
代码实现
<pre style="background-color: rgb(43, 43, 43); font-family: "JetBrains Mono", monospace; font-size: 9.8pt; color: rgb(169, 183, 198);">public static void sort(int[] arr){<br> //求最高位数<br> int max = 0;<br> int min = 0;<br> for (int i : arr) {<br> if (i > max)max = i;<br> if (i < min)min = i;<br> }<br> int digit = 1;<br> while(max / 10 > 0){<br> max /= 10;<br> digit++;<br> }<br> //开始基数排序<br> for (int i = 1; i <= digit; i++) {<br> int[] count = new int[10];<br> int[] result = new int[arr.length];<br> //求每次该和多少取余<br> int times = 1;<br> for(int j = 1;j < i; j++){<br> times *= 10;<br> }<br> for (int k = 0; k < arr.length; k++) {<br> count[(arr[k]/times)%10]++;<br> }<br> for (int l = 1; l < count.length; l++) {<br> count[l] += count[l-1];<br> }<br> for (int m = arr.length - 1; m >= 0 ; m--) {<br> result[--count[(arr[m]/times)%10]] = arr[m];<br> }<br> System.arraycopy(result,0,arr,0,arr.length);<br> }<br> }<br></pre>
计数排序
时间复杂度
O(n+k)
空间复杂度
O(n+k)
稳定性
稳定
代码实现
不稳定
<pre style="background-color: rgb(43, 43, 43); font-family: "JetBrains Mono", monospace; font-size: 9.8pt; color: rgb(169, 183, 198);">public static void sort(int[] arr,int low,int high){<br> int[] count = new int[high - low + 1];<br> int[] result = new int[arr.length];<br> for (int i : arr) {<br> count[i]++;<br> }<br> for (int i = 0; i < result.length; i++) {<br> for (int j = 0; j < count.length; j++) {<br> while (count[j]-- > 0){<br> result[i++] = j;<br> }<br> }<br> }<br> for (int i = 0; i < arr.length; i++) {<br> arr[i] = result[i];<br> }<br> }<br></pre>
改进成稳定
<pre style="background-color: rgb(43, 43, 43); font-family: "JetBrains Mono", monospace; font-size: 9.8pt; color: rgb(169, 183, 198);">public static void sort(int[] arr,int low,int high){<br> int[] count = new int[high - low + 1];<br> int[] result = new int[arr.length];<br> for (int i : arr) {<br> count[i - low]++;<br> }<br> for (int i = 1; i < count.length; i++) {<br> count[i] = count[i] + count[i-1];<br> }<br> for (int i = arr.length - 1; i >= 0; i--) {<br> result[--count[arr[i] - low]] = arr[i];<br> }<br> for (int i = 0; i < arr.length; i++) {<br> arr[i] = result[i];<br> }<br> }<br></pre><br>
0 条评论
下一页