一、冒泡排序
我的理解就是,以从小到大排序为例,就是不停 的将最小的排到前面冒出来,或者把最大的,第二大的,一个一个的冒泡到最后。
1.1、常规冒泡
int[] array1 = new int[] { 2, 4, 3, 7, 8, 5 };
///
/// 冒泡排序,将小的数不停冒泡到前排。
///
public void BubbleSort1()
{
for (int i = 0; i < array1.Length; i++)
{
for (int j = i + 1; j < array1.Length; j++)
{
if (array1[j] < array1[i])
{
Swip(array1, i, j);
}
}
}
PrintInfo();
}
public void BubbleSort2()
{
for (int i = array1.Length - 1; i > 0; i--)
{
for (int j = i - 1; j >= 0; j--)
{
if (array1[j] > array1[i])
{
Swip(array1, i, j);
}
}
}
PrintInfo();
}
另外一种冒泡
public void BubbleSort2()
{
for (int i = array1.Length - 1; i > 0; i--)
{
for (int j = 0; j < i; j++)
{
if (array1[j] > array1[j + 1])
{
Swip(array1, j, j + 1);
}
}
}
PrintInfo();
}
public void BubbleSort3()
{
for (int i = 0; i < array1.Length; i++)
{
for (int j = array1.Length - 1; j > i; j--)
{
if (array1[j] < array1[j - 1])
{
Swip(array1, j, j - 1);
}
}
}
PrintInfo();
}
1.2、改进冒泡
///
/// 加标志位的排序
///
public void BubbleSortFlag1()
{
bool flag;
for (int i = array1.Length - 1; i > 0; i--)
{
flag = true;
for (int j = 0; j < i; j++)
{
if (array1[j] > array1[j + 1])
{
Swip(array1, j, j + 1);
flag = false;
}
}
if (flag)
{
Debug.Log("break" + i);
break;
}
}
PrintInfo();
}
public void BubbleSortFlag2()
{
bool flag;
for (int i = 0; i < array1.Length; i++)
{
flag = true;
for (int j = array1.Length - 1; j > i; j--)
{
if (array1[j] < array1[j - 1])
{
Swip(array1, j, j - 1);
flag = false;
}
}
if (flag)
{
break;
}
}
PrintInfo();
}
二、选择排序
///
/// 选择排序
///
int min;
public void SelectSort()
{
for (int i = 0; i < array1.Length; i++)
{
min = i;
temp = array1[i];
for (int j = i + 1; j < array1.Length; j++)
{
if (array1[j] < array1[i])
{
min = j;
temp = array1[j];
}
}
if (min != i)
{
Swip(array1, min, i);
}
}
PrintInfo();
}
三、插入排序
插入排序是一种对于有序数列高效的排序。非常聪明的排序。只是对于随机数列,效率一般,交换的频率高。
public void InsertSort()
{
int temp;
for (int i = 0; i < array1.Length; i++)
{
temp = array1[i];//7
for (int j = i - 1; j >= 0; j--)
{
if (array1[j] > temp)
{
array1[j + 1] = array1[j];
if (j == 0)
{
array1[0] = temp;
break;
}
}
else
{
array1[j + 1] = temp;
break;
}
}
}
}
用二分法优化的插入排序
public void InsertSortWithBinary()
{
int temp;
int tempIndex;
for (int i = 0; i < array1.Length; i++)
{
temp = array1[i];
tempIndex = BinarySearch(array1, 0, i, i);
for (int j = i - 1; j >= tempIndex; j--)
{
array1[j + 1] = array1[j];
}
array1[tempIndex] = temp;
}
PrintInfo();
}
public int BinarySearch(int[] arr, int low, int high, int index)
{
if (low >= arr.Length - 1) return arr.Length - 1;
if (high <= 0) return 0;
int mid = (low + high) / 2;
if (mid == index) return mid;
if (arr[index] > arr[mid])
{
if (arr[index] < arr[mid + 1])
{
return mid + 1;
}
return BinarySearch(arr, mid + 1, high, index);
}
else
{
if (mid - 1 < 0) return 0;
if (arr[index] > arr[mid - 1])
{
return mid;
}
return BinarySearch(arr, low, mid - 1, index);
}
}
其他方法
int t;
public void Swip(int[] a, int i, int j)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
private void PrintInfo()
{
for (int k = 0; k < array1.Length; k++)
{
Debug.Log("" + array1[k]);
}
}