using System; using System.Collections.Generic; using System.Text; namespace DS_Sort { /// <summary> /// 四种排序算法 /// </summary> class DSSort { //----------------直接插入排序------------------------------------ public void InsertASC(int[] arrar) //直接插入 升序排序 { if (arrar == null || arrar.Length <= 0) { Console.WriteLine("找不到可排序的元素!"); return; } for (int i = 1; i < arrar.Length; i++) { if (arrar[i] < arrar[i - 1]) { int tmp = arrar[i]; int j = i - 1; for (; j >= 0 && tmp < arrar[j]; j--) { arrar[j + 1] = arrar[j]; } arrar[j + 1] = tmp; } } foreach (int i in arrar) { Console.Write(i + " "); } } public void InsertDESC(int[] arrar) //直接插入 降序排序 { if (arrar == null || arrar.Length <= 0) { Console.WriteLine("找不到可排序的元素!"); return; } for (int i = 1; i < arrar.Length; i++) { if (arrar[i] > arrar[i] - 1) { int tmp = arrar[i]; int j = i - 1; for (; j >= 0 && tmp > arrar[j]; j--) { arrar[j + 1] = arrar[j]; } arrar[j + 1] = tmp; } } foreach (int i in arrar) { Console.Write(i + " "); } } //-------------冒泡排序--------------------------------------- public void BubbleASC(int[] arrar) //冒泡排序 升序 { if (arrar == null || arrar.Length <= 0) { Console.WriteLine("找不到可排序的元素!"); return; } for (int i = 0; i < arrar.Length - 1; i++) { for (int j = arrar.Length - 1; j > i; j--) { if (arrar[j] < arrar[j - 1]) { int tmp = arrar[j]; arrar[j] = arrar[j - 1]; arrar[j - 1] = tmp; } } } foreach (int B in arrar) { Console.Write(B + " "); } } public void BubbleDESC(int[] arrar) //冒泡排序 降序 { if (arrar == null || arrar.Length <= 0) { Console.WriteLine("找不到可排序的元素!"); return; } for (int i = 0; i < arrar.Length - 1; i++) { for (int j = arrar.Length - 1; j > i; j--) { if (arrar[j] > arrar[j - 1]) { int tmp = arrar[j]; arrar[j] = arrar[j - 1]; arrar[j - 1] = tmp; } } } foreach (int B in arrar) { Console.Write(B + " "); } } public void Buffer() //用一个循环写的冒泡,性能上要差得多 { int[] a = { 7, 4, 9, 3, 2 }; for (i = 0; i < 4; ) { if (a[i] > a[i + 1]) { b = a[i]; a[i] = a[i + 1]; a[i + 1] = b; i = 0; //关键在这里 } else { i++; } } } //----------------直接选择排序-------------------------------------------------- public void SelectASC(int[] arrar) //直接选择排序 升序 , 是一种不稳定排序 { int tmp = 0; if (arrar == null || arrar.Length <= 0) { Console.WriteLine("找不到可排序的元素!"); return; } for (int i = 0; i < arrar.Length - 1; i++) { int Min = i; for (int j = i + 1; j <= arrar.Length - 1; j++) { if (arrar[j] < arrar[Min]) { Min = j; } } if (Min != i) { tmp = arrar[i]; arrar[i] = arrar[Min]; arrar[Min] = tmp; } } foreach (int S in arrar) { Console.Write(S + " "); } } public void SelectDESC(int[] arrar) //直接选择排序 降序 , 是一种不稳定排序 { int tmp = 0; if (arrar == null || arrar.Length <= 0) { Console.WriteLine("找不到可排序的元素!"); return; } for (int i = 0; i < arrar.Length - 1; i++) { int Max = i; for (int j = i + 1; j <= arrar.Length - 1; j++) { if (arrar[j] > arrar[Max]) { Max = j; } } if (Max != i) { tmp = arrar[i]; arrar[i] = arrar[Max]; arrar[Max] = tmp; } } foreach (int S in arrar) { Console.Write(S + " "); } } // ------------快速排序算法,是一种不稳定排序------------------------------------------------- public void QuickASC(int[] arrar, int low, int high) { if (low < high) { int Pivot = DichotomyASC(arrar, low, high); QuickASC(arrar, low, Pivot - 1); QuickASC(arrar, Pivot + 1, high); } } public void QuickDESC(int[] arrar, int low, int high) { if (low < high) { int Pivot = DichotomyDESC(arrar, low, high); QuickDESC(arrar, low, Pivot - 1); QuickDESC(arrar, Pivot + 1, high); } } public int DichotomyASC(int[] arrar, int low, int high) //快速排序 升序 { int p = arrar[low]; while (low < high) { //如果high的数据大于等于支点p的数据时,将high指针依次向低端移动1个一个位置 while (low < high && arrar[high] >= p) { high--; } if (low != high) { arrar[low] = arrar[high]; //将high的数据复制到low中,low向高端移动一个位置 low++; } //如果low的数据小于支点p的数据,将low指针向高端移动一个位置 while (low < high && arrar[low] <= p) { low++; } if (low != high) { arrar[high] = arrar[low]; //将low的数据复制到high中 ,high向低端移动一个位置 high--; } } arrar[high] = p; return high; } public int DichotomyDESC(int[] arrar, int low, int high) //快速排序 降序 { int p = arrar[low]; while (low < high) { while (low < high && arrar[high] <= p) { high--; } if (low != high) { arrar[low] = arrar[high]; low++; } while (low < high && arrar[low] >= p) { low++; } if (low != high) { arrar[high] = arrar[low]; high--; } } arrar[high] = p; return high; } } }