一直想重温一下有关算法的内容,这几天项目上线,有时间看点东西,整理一下
第一部分,三种基本排序
1冒泡排序
(1)原理:
1、从第一个数据开始,与第二个数据相比较,如果第二个数据小于第一个数据,则交换两个数据的位置。
2、指针由第一个数据移向第二个数据,第二个数据与第三个数据相比较,如果第三个数据小于第二个数据,则交换两个数据的位置。
3、依此类推,完成第一轮排序。第一轮排序结束后,最大的元素被移到了最右面。
4、依照上面的过程进行第二轮排序,将第二大的排在倒数第二的位置。
5、重复上述过程,没排完一轮,比较次数就减少一次
代码如下:
private static void SortDetail(int[] arr) {
int temp=0;
for(int i=0;i<arr.length-1;i++) {
for(int j=i;j<arr.length;j++) {
if(arr[i]>arr[j]) {
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
}
2 选择排序
1.内循环则为使用第一个数与其他的数比较,得出一个最小的数
2.将最小的这个元素和数组中第一个元素交换位置
3.在剩下的元素中找到最小的的元素,与数组第二个元素交换位置
4.重复以上步骤,即可以得到有序数组。
代码如下:
private static void SortDetail(int[] arr) {
int k=0;
int temp=0;
for(int i=0;i<arr.length;i++) {
k=i;
for(int j=i;j<arr.length;j++) {
if(arr[j]<arr[k])
k=j;
}
temp=arr[k];
arr[k]=arr[i];
arr[i]=temp;
}
}
3.插入排序
1、将指针指向某个元素,假设该元素左侧的元素全部有序,将该元素抽取出来,然后按照从右往左的顺序分别与其左边的元素比较,遇到比其大的元素便将元素右移,直到找到比该元素小的元素或者找到最左面发现其左侧的元素都比它大,停止;
2、此时会出现一个空位,将该元素放入到空位中,此时该元素左侧的元素都比它小,右侧的元素都比它大;
3、指针向后移动一位,重复上述过程。每操作一轮,左侧有序元素都增加一个,右侧无序元素都减少一个。
代码如下:
private static void SortDetail(int[] arr) {
for(int i=0;i<arr.length;i++) {
int j=i;
int temp=arr[j];
while(j>0&&arr[j-1]>=temp) {
arr[j]=arr[j-1];
j--;
}
arr[j]=temp;
}
}
}