一、插入排序
将初始数据分为有序序列和无序序列,每次遍历无序序列都将其中一个数据插入到有序序列中排序,直到所有元素都确定位置为止。
插入排序一般由两层循环+自减组成。
外层循环:确定当前有序序列中元素的个数。
内层循环:循环比较判断当前无序序列中第一个元素在有序序列中的位置。
自减:当判断无序序列中的第一个元素在插入有序序列时要向前插入,就让其对应序列的下标向前移动,使数据插入。
Python写法:
# 定义插入排序函数,输入:(列表)
def Insert_Sort(array):
for i in range(len(array)):
while array[i - 1] > array[i] and i - 1 >= 0:
array[i],array[i - 1] = array[i - 1],array[i]
i -= 1 # 检查左侧是否都符合条件,符合则跳过,不符合就接着替换
return array
# 调用插入排序
if __name__ == '__main__':
array = [9, 2, 8, 4, 7, 1, 0, 29]
Insert_Sort(array)
print(array)
C++写法:
#include <iostream>
using namespace std;
//定义插入排序函数,输入:(数组,数组长度)
void Insert_Sort(int *array,int len){
for(int i = 0; i <= len; i++){
while(array[i - 1] > array[i] && i - 1 >= 0){
int b = array[i];
array[i] = array[i-1];
array[i-1] = b;
i--;
}
}
}
//调用插入排序
int main(){
int array[] = {2,3,6,1,8,1,7,5};
int len = sizeof(array)/sizeof(array[0]);
Insert_Sort(array,len);
for(int k = 0; k <= len; k++){
cout << array[k] << ' ';
}
return 0;
}
二、快速排序
(*此处使用的是填坑法)
取序列首个元素为标准值,定义两处下标,一处指向序列首位,一处指向序列末位。定义标准值后将指向末位的下标向左移动,直到遇到排序时应当放在标准值左侧的元素时停止,并对当前两处下标所指向的元素做互换,然后开始让指向序列首位的下标开始向右移动,直到遇到排序时应当放在标准值右侧的元素时停止,并对当前两处下标所指向的元素做互换,随即再次启动处于右侧的下标向左移动,重复上述步骤直到两处下标在同一位置重合,此处即为标准值在序列中的固定位置。
接着以刚刚确定好的标准值为分界点分为左区和右区,对左区和右区分别以其序列的首位作为新的标准值并重复上述找标准值位置的操作,然后再次分区,直到细分下来的左/右区只有一个元素或没有元素时截止,直到每个标准值都有确定唯一的位置后排序结束。
快速排序通常用到的方法是分区+递归。
分区前要确定当前标准值的位置,此时用两层循环,外层循环判断当前左右两处下标是否重合,若重合则让当前标准值放入该下标之下;内层循环用以判断是否需要将当前下标对应元素与另一侧的下标对应的元素互换位置。
当确定标准值后则以标准值为分界分为左区和右区。
左区和右区分别再次做分区准备,递归运行。
Python写法:
# 定义快速排序(填坑法)函数,输入:(列表,起始位下标,末位下标)
def Quick_Sort(array, begin, end): # 填坑法
if begin >= end:
return
i = begin
j = end
key = array[begin]
while i < j:
while array[j] >= key and i < j:
j -= 1
array[i] = array[j]
while array[i] <= key and i < j:
i += 1
array[j] = array[i]
array[i] = key
Quick_Sort(array, begin, i - 1)
Quick_Sort(array, i + 1, end)
# 调用快速排序
if __name__ == '__main__':
array = [9, 2, 8, 4, 7, 1, 0, 29]
Quick_Sort(array, 0, len(array)-1)
print(array)
C++写法:
#include <iostream>
using namespace std;
//定义快速排序(填坑法),输入:(数组,起始位下标,末位下标)
void QuickSort(int *array, int begin, int end){
if(begin >= end){ //若待排序序列只有一个元素或没有元素时,返回空
return ;
}
int i = begin; //i作为指针从左向右扫描
int j = end; //j作为指针从右向左扫描
int key = array[begin];//最左边的元素作为标准值
while(i < j){//判断
while(array[j] >= key && i < j){ //从右边找小于基准数的元素
j--; //找不到则j减一
}
array[i] = array[j]; //找到则赋值
while(array[i] <= key && i < j){ //从左边找大于基准数的元素
i++; //找不到则i加一
}
array[j] = array[i]; //找到则赋值
}
array[i] = key; //当i和j相遇,将基准元素赋值到指针i处
QuickSort(array, begin, i - 1); //i左边的序列继续递归调用快排
QuickSort(array, i + 1, end); //i右边的序列继续递归调用快排
}
//调用快速排序
int main(){
int array[] = {49, 38, 65, 97, 76, 13, 27, 49};
int length = sizeof(array)/sizeof(array[0]);
cout << "原始序列:";
for(int i = 0; i < length; i++){
cout << array[i] << " ";
}
cout << endl;
QuickSort(array, 0, length-1);
cout << "快排序列:";
for(int i = 0; i < length; i++){
cout << array[i] << " ";
}
return 0;
}