排序学习 - 为了面对算法面试(1)
2017-10-16 本文已影响0人
AnnieAri
前言
不懂就要问不会就要查!排序代码我选择用Swift演示(暂时觉得Swift真不适合写排序🤣)
放在前面的基础理论知识
- 稳定排序与不稳定排序:通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj,Ai原来在位置前,排序后Ai还是要在Aj位置前。
- 时间复杂度
- 空间复杂度
- 内排序和外排序:字数不多,点击去看
先从简单的开始:
- 1.选择排序:
方法原理:
- 对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面“后一个元素”现变成了“前一个元素”,继续跟他的“后一个元素”进行比较如果后面的元素比他要小则用变量k记住它在数组中的位置(下标),等到循环结束的时候,我们应该找到了最小的那个数的下标了,然后进行判断,如果这个元素的下标不是第一个元素的下标,就让第一个元素跟他交换一下值,这样就找到整个数组中最小的数了。然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推。
代码实现:
//选择排序:
func selectionSort(arr:inout [Int]) -> [Int]{
for i in 0..<arr.count-1{
for j in i+1..<arr.count{
if arr[i] > arr[j] {
let temp = arr[j]
arr[j] = arr[i]
arr[i] = temp
}
}
}
return arr
}
-
2.冒泡排序:
方法原理:
- 冒泡排序算法的运作如下:(从后往前)
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
- 冒泡排序算法的运作如下:(从后往前)
代码实现:
//冒泡排序
func bubbleSort(arr:inout [Int]) -> [Int]{
for i in 0..<arr.count-1{
for j in 0..<arr.count-1-i{
if arr[j] > arr[j+1] {
let temp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = temp
}
}
}
return arr
}
- 3插入排序:
方法原理:
- 每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。
假设在一个无序的数组中,要将该数组中的数按插入排序的方法从小到大排序。假设啊a[]={3,5,2,1,4};插入排序的思想就是比大小,满足条件交换位置,一开始会像冒泡排序一样,但会比冒泡多一步就是交换后(a[i]=a[i+1]后)原位置(a[i])会继续和前面的数比较满足条件交换,直到a[i+1]前面的数组是有序的。比如在第二次比较后数组变成a[]={2,3,5,1,4};
- 每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。
//插入排序
func insertionSorting(arr:inout [Int]) -> [Int]{
for i in 1..<arr.count {
var j = i-1
while(j >= 0){
if arr[j] > arr[j+1] {
let temp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = temp
}else{
//如果 j 这个元素比 j+1的小 那么前面不用比了 都比 j+1的小
break
}
j -= 1
}
}
return arr
}
to be continue!