直插排序
static void InsertSort(int[] dateArray)
{
for (int i = 1; i < dateArray .Length ; i++)
{
int iValue = dateArray[i];
bool isInsert = false;
//从第二个元素开始拿到i位置元素,和前面的元素对比
//如比I大,就让其向后移动,(保证前面的元素从小到大排序)
for (int j = i - 1; j >= 0; j--)
{
if (dateArray [j]>iValue)
{
dateArray[j + 1] = dateArray[j];
}else//在前面发现一比i小的值就停止移动
{
dateArray[j + 1] = iValue;
isInsert = true;
break;
}
}
if (isInsert ==false)//前面的值都比i大将i放到最前面
{
dateArray[0] = iValue;
}
}
}
冒泡排序
static void BubbleSort(int[] dateArray)
{
for (int i = dateArray.Length-1; i > 0 ; i--)//总循环次数(n-1)
{
for (int j = 0; j < i; j++)//循环n次后后n个数已经最大不需在进入比较
{
if (dateArray [j]>dateArray [j+1])
{
int temp = dateArray[j];
dateArray[j] = dateArray[j + 1];
dateArray[j + 1] = temp;
}
}
}
}
static void BubbleSort2(int[] sortArray)
{
bool isChang = true;
do
{
isChang = false;
for (int i = 0; i < sortArray.Length - 1; i++)
{
if (sortArray[i] > sortArray[i + 1])
{
int temp = sortArray[i];
sortArray[i] = sortArray[i + 1];
sortArray[i + 1] = temp;
isChang = true;
}
}
//isChange仍为false,则说明相邻前面的数都比后面的数小不需要排序,退出循环
} while (isChang);
}
选择排序
static void SelectSort(int[] dateArray)
{
for (int i = 0; i < dateArray .Length-1 ; i++)
{
int minIndex = i;
for (int j = i+1; j < dateArray.Length ; j++)
{
if (dateArray [j]<mindate )
{
mindate = dateArray[j];
minIndex = j;
}
}
if (minIndex !=i)
{
int temp = dateArray[i];
dateArray[i] = mindate;
dateArray[minIndex] = temp;
}
}
}
//希尔排序
///
/// 希尔排序
///
///
public static void ShellSort(int [] arr)
{
int inner, temp;
/int h = 1;
while (h < arr.Length / 3)
{
h = h * 3 + 1;
}/
int h = 3;//间隔值
while (h>0)
{
for (int i = h; i <= arr .Length-1; i++)
{
temp = arr[i];
inner = i;
while((inner >h-1)&&arr[inner-h]>=temp)
{
arr[inner] = arr[inner - h];
inner -= h;
}
arr[inner] = temp;
}
h = (h - 1) % 3;
}
}
快速排序
/// <summary>
/// 对数组范围内的数据进行排序
/// </summary>
/// <param name="dateArray">要排序的数组</param>
/// <param name="left">开始索引</param>
/// <param name="right">结束索引</param>
static void QuickSort(int [] dateArray,int left,int right)
{
if (left <right )
{
int x = dateArray[left];//基准数,把比它小或等于它的放在它左边,然后把比它大的放在右边
int i = left;
int j = right;
while (true && i < j)
{
//从后往前比较,(从右往左找一个小于/等于x的数字)
while (true && i < j)
{
if (dateArray[j] < x)//找到了一个小于基准数的数字,把它放在x左边(i位置)
{
dateArray[i] = dateArray[j];
break;
}
else
{
j--;
}
}
//从前往后找一个(左到右找一个比x大的数字,放在放在基准位置(j)
while (true && i < j)
{
if (dateArray[i] > x)
{
dateArray[j] = dateArray[i];
break;
}
else
{
i++;
}
}
}
dateArray[i] = x;
QuickSort(dateArray, left, i - 1);
QuickSort(dateArray, i + 1, right);
}
}
//递归快排
static void Qsort(int[] array,int left,int right)
{
if(left<right)
{
int i = left;
int j = right + 1;
int provt = array[i];
do
{
do i++; while (array[i] < provt && i < array.Length-1);//从左往右找比基准值大的
do j--; while (array[j] > provt && j >= 0);//从右往左找比基准值小的
if(i<j)//左右未交错,即交换
{
Swap(ref array[i], ref array[j]);
}
} while (i<j);//左右未交错继续寻找,交错则退出循环
Swap(ref array[left], ref array[j]);//退出循环时j仍是比基准值小的数,i仍是比基准值大的数,可将基准值与j位置值交换。之后左右递归调用快排
Qsort(array, left, j - 1);
Qsort(array, j + 1, right);
}
}
static void Swap(ref int a,ref int b)
{
int temp = a;
a = b;
b = temp;
}